-1

你能告诉我为什么下面代码的结果是BaseClass::method?我在想 DerivedClass2 只会覆盖被声明为新的 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();
        }
    }
4

3 回答 3

0

您正在调用 的非virtual方法BaseClass

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

于 2015-10-25T16:40:56.753 回答
0

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

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

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

于 2015-10-25T16:54:51.520 回答
0

因为在这一行:

BaseClass e = new DerivedClass2(); 

eBaseClass对象一样行动。所以它调用BaseClass.method.

就像你写的:

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

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

于 2016-01-14T12:52:27.437 回答