日期:2014-05-17  浏览次数:20737 次

父类引用指向子类实例问题请教
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 的不同调用会表现出不同的行为,这就是多态