您能否告诉我为什么以下代码的结果是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();
}
}
答案 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();
您必须阅读更多内容并了解继承和多态性。