c#两层继承隐藏覆盖方法

本文关键字:继承 隐藏 覆盖 方法 两层 | 更新日期: 2023-09-27 18:19:06

请告诉我为什么下面代码的结果是BaseClass::method ?我认为DerivedClass2将只是覆盖被声明为new的DerivedClass1的虚拟方法,这意味着不使用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();
        }
    }

c#两层继承隐藏覆盖方法

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

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

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

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

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

因为在这一行中:

BaseClass e = new DerivedClass2(); 

e的行为类似于BaseClass对象。所以它调用BaseClass.method

就像你写的:

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

你必须多读一些,了解继承和多态性