c#两级继承隐藏重写方法

时间:2015-10-25 16:37:17

标签: c# override shadowing

您能否告诉我为什么以下代码的结果是BaseClass::method? 我原以为DerivedClass2只会覆盖DerivedClass1的虚方法,该方法被声明为new,这意味着不使用BaseClass方法。或者由于DerivedClass2重写了DerivedClass1的虚方法,因此动态绑定将调用DerivedClass2方法版本而不是DerivedClass1或BaseClass。有帮助吗?我的推理有什么问题?感谢

class BaseClass
    {
        public void method() { Console.WriteLine("BaseClass::method"); }
    }
    class DerivedClass1 : BaseClass
    {
        public new virtual void method() { Console.WriteLine("DerivedClass1::method"); }
    }
    class DerivedClass2 : DerivedClass1
    {
        public override void method(){ Console.WriteLine("DerivedClass2::method"); }
    }
    class Program
    {
        static void Main(string[] args)
        {    
            BaseClass e = new DerivedClass2();
            e.method();//BaseClass::method. But Why???

            Console.ReadLine();
        }
    }

3 个答案:

答案 0 :(得分:0)

您正在调用virtual的非BaseClass方法。

无论派生类是否添加其他方法,这都是将被调用的方法。

答案 1 :(得分:0)

BaseClass.method()不是虚拟的。 DerivedClass1中的虚拟方法隐藏,然后在DerivedClass2中覆盖。

变量e的类型是BaseClass,这是编译器用来查找要调用的方法的内容。唯一的选择是非虚拟BaseClass.method()。如果将变量的类型更改为DerivedClass1,编译器将解析对virtual new DerivedClass1.method()的调用。在运行时,将调用DerivedClass2.method()

使用new修饰符隐藏方法时,不要指望多态行为。

答案 2 :(得分:0)

因为在这一行:

BaseClass e = new DerivedClass2(); 

e就像BaseClass对象一样。所以它调用了BaseClass.method

就像你写的那样:

DerivedClass2 e = new DerivedClass2();
((BaseClass)e).method();

您必须阅读更多内容并了解继承和多态性。