class Program
{
static void Main(string[] args)
{
A a = new C();
a.Show();
Console.ReadKey();
}
}
public class A
{
public A()
{
Console.Write("A构造中调用结果:");
Show();
}
public virtual void Show()
{
Console.WriteLine("A");
}
}
public class B : A
{
public B()
{
Console.Write("B构造中调用结果:");
Show();
}
public new virtual void Show() //覆盖父类A的方法
{
Console.WriteLine("B");
}
}
public class C : B
{
public C()
{
Console.Write("C构造中调用结果:");
Show();
}
public override void Show() //重写B类的方法
{
Console.WriteLine("C");
}
}
结果如下:A
子类的实例只调用子类的方法, 父类的实例只调用父类的方法.
如果把子类实例给父类,通过父类实例调用方法,那就不一样了 ,搜索函数入口时从父类的入口表开始,根据虚方法定义查找子类的重写方法.
如上
搜索函数入口时从基类A的入口表开始,根据虚方法定义查找子类的重写方法,但是由于无法再B类定义中发现override方法则最终调用的是A的现实