Цепочка наследования следующая:
class A
{
public virtual void Foo()
{
Console.WriteLine("A method");
}
}
class B:A
{
public override void Foo()
{
Console.WriteLine("B method");
}
}
class C:B
{
public new virtual void Foo()
{
Console.WriteLine("C method");
}
}
class D:C
{
public override void Foo()
{
Console.WriteLine("D method");
}
}
то
class Program
{
static void Main(string[] args)
{
A tan = new D();
tan.Foo();
Console.Read();
}
}
В результате вызывается метод foo() в классе B.
Но в reference:
При вызове виртуального метода тип времени выполнения объекта проверяется на переопределение элемента. Превосходящий член в большинстве вызывается класс, который может быть исходным, если нет производный класс переопределил член.
В моей логике CLR сначала обнаруживает, что Foo()
является виртуальным методом, он просматривает таблицу методов D
, тип среды выполнения, затем обнаруживает, что в этом наиболее производном классе есть переопределяющий член, он должен назовите его и никогда не понимаете, что существует цепочка new Foo()
в цепочке наследования.
Что не так с моей логикой?