【发布时间】:2017-08-25 00:42:43
【问题描述】:
继承链如下:
class A
{
public virtual void Foo()
{
Console.WriteLine("A's method");
}
}
class B:A
{
public override void Foo()
{
Console.WriteLine("B's method");
}
}
class C:B
{
public new virtual void Foo()
{
Console.WriteLine("C's method");
}
}
class D:C
{
public override void Foo()
{
Console.WriteLine("D's method");
}
}
然后:
class Program
{
static void Main(string[] args)
{
A tan = new D();
tan.Foo();
Console.Read();
}
}
结果是,B 类中的 foo() 方法被调用。
但是在reference:
当调用虚方法时,对象的运行时类型为 检查覆盖成员。最重要的成员 派生类被调用,它可能是原始成员,如果没有 派生类已覆盖该成员。
在我的逻辑中,CLR首先发现Foo()是一个虚方法,它查看D的方法表,运行时类型,然后它发现在这个最派生类中有一个覆盖成员,它应该调用它,却从未意识到继承链中有new Foo()。
我的逻辑有什么问题?
【问题讨论】:
标签: c# .net inheritance