在C#中考虑这段代码:
public class A
{
public A()
{
Console.WriteLine("A");
}
public virtual void One()
{
Console.WriteLine("One of A");
}
public virtual void Two()
{
One();
}
}
public class B : A
{
public B()
{
Console.WriteLine("B");
}
public override void One()
{
Console.WriteLine("One of B");
}
public override void Two()
{
Console.WriteLine("Two of B");
}
public void Three()
{
base.Two();
}
}
和主要:
A a3 = new B(); //"A" and then "B"
a3.Two();' //"Two of B"
((B)a3).Three(); //"One of B"
为什么主程序中的最后一行写了“B'之一”? 为什么当它执行One()时它会转到B的One()?
答案 0 :(得分:8)
分解每个方法调用的内容 -
((B)a3).Three();
呼叫
B.Three();
调用
A.Two();
调用
A.One();
但是A.One
是虚拟,这意味着系统必须在运行时查看对象的实际类型以确定哪个< / em> One
将被调用。
由于a3
引用的对象是B
(即使您声明它为A
变量引用),B.One()
是调用。
答案 1 :(得分:0)
因为变量a3
是类型B,并且因为类型A&#39; s两个方法被标记为virtual
,所以编译器推断应该调用的方法是类型B&#39;被覆盖的One()
的实现。
答案 2 :(得分:0)
因为类A的方法One()被声明为虚拟并且它在类B中找到了覆盖,所以它选择了覆盖。