首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

父类引用指向子类实例有关问题请问

2013-06-19 
父类引用指向子类实例问题请教using System class A { public void F( ) { Console.WriteLine(A.F)

父类引用指向子类实例问题请教
using System ; 

class A 

public void F( ) { Console.WriteLine("A.F") ; } 
public virtual void G( ) { Console.WriteLine("A.G") ; } 


class B: A 

new public void F( ) { Console.WriteLine("B.F") ; } 
public override void G( ) { Console.WriteLine("B.G") ; } 


class Test 

static void Main( ) 

B b = new B( ) ; 
A a = b; 
a.F( ) ;  
a.G( ) ; 


上面的程序中 ,  为什么 a.F( ) ; 这一句的运行结果是 A.F , 
而不是 B.F 呢 ???
[解决办法]
因为B的void F( )为new 类型的
[解决办法]
A.F又不是 虚 抽象方法,子类没办法重写,当然还是 调用自己。
[解决办法]
因为a的类型是A,并且方法F不是虚函数,所以aF()的运行结果是 A.F 
[解决办法]
这里涉及两个概念,编译时类型和运行时类型,a 的编译时类型是 A,运行时类型是 B,没有声明为 virtual 的调用,由编译时类型确定,因此 a.F() 调用的就是 A.F,如果声明为 virtual,则编译时不能确定调用哪个函数,而要由 a 的运行时类型确定,这就是 a.G() 的调用方式



[解决办法]
变量 a 的编译时类型是 A,但运行时类型可以是 A, B, C, D...,每个类都实现了自己的方法 G,因此对 a.G 的不同调用会表现出不同的行为,这就是多态

热点排行