我已经阅读了一些关于C#中的方法隐藏和覆盖的教程(包括MSDN网站上的那些教程),并且在尝试理解逻辑的过程中,我在一段代码中遇到了一个问题:< / p>
class A
{
public virtual void Foo()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void Foo()
{
Console.WriteLine("B");
}
}
class C : B
{
new public virtual void Foo()
{
Console.WriteLine("C");
}
}
class Driver
{
static void Main()
{
A a = new A();
a.Foo();
B b = new B();
b.Foo();
C c = new C();
c.Foo();
a = new B();
a.Foo();
a = new C();
a.Foo();
Console.ReadKey();
}
}
每当我运行该代码时,我得到这个输出: 一个 乙 C 乙 乙
我理解前四个,但第五个输出不应该是&#39; C&#39;因为运行时实例是C而不是A?我对方法隐藏感觉不太舒服,但不应该宣布&#34;新的公共虚拟空虚Foo()&#34;在C类中允许调用Foo()而不是B中的那个?
答案 0 :(得分:3)
第五个输出是B
,因为您正在查看C
实例,就好像它是A
实例一样,这就是您开始方法调度的地方。
从A.Foo
开始,它继承链,检查B.Foo
和C.Foo
。由于C.Foo
标有new
修饰符,因此B.Foo
是实际调用的。{/ p>
您将获得C
作为以下代码段的输出:
C c = new C();
c.Foo();