次のコードを考えてみましょう (少し長いですが、従うことができれば幸いです)。
class A
{
}
class B : A
{
}
class C
{
public virtual void Foo(B b)
{
Console.WriteLine("base.Foo(B)");
}
}
class D: C
{
public override void Foo(B b)
{
Console.WriteLine("Foo(B)");
}
public void Foo(A a)
{
Console.WriteLine("Foo(A)");
}
}
class Program
{
public static void Main()
{
B b = new B();
D d = new D ();
d.Foo(b);
}
}
このプログラムの出力が "Foo(B)" だと思うなら、あなたは私と同じ船に乗っているでしょう: 完全に間違っています! 実際には「Foo(A)」を出力します
クラスから仮想メソッドを削除すると、C
期待どおりに機能します。「Foo(B)」が出力されます。
コンパイラは、より派生したクラスであるA
場合にバージョンを選択するのはなぜですか?B