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