了解C#中的虚方法,方法隐藏和覆盖

时间:2014-06-23 19:46:27

标签: c# oop

我已经阅读了一些关于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中的那个?

1 个答案:

答案 0 :(得分:3)

第五个输出是B,因为您正在查看C实例,就好像它是A实例一样,这就是您开始方法调度的地方。

A.Foo开始,它继承链,检查B.FooC.Foo。由于C.Foo标有new修饰符,因此B.Foo是实际调用的。{/ p>

您将获得C作为以下代码段的输出:

C c = new C();
c.Foo();