0

基本的なオブジェクトのスライシングは理解できますが、そのような例になると非常に混乱することがあります

using System;
class A
{
   public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
   public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
   new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
   public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
   static void Main() {
      D d = new D();
      A a = d;
      B b = d;
      C c = d;
      a.F();
      b.F();
      c.F();
      d.F();
   }
}

出力:

B.F
B.F
D.F
D.F

クラスBの「f()」関数にたどり着くまでの経緯を知りたい

D d = new D();
A a = d;
a.F();

もしそうなら:

A a = new A();
a.F()
//The result would be => A.F  

ただし、最初の部分では、「a」には「d」の実行時オブジェクトがあるため、出力として「DF」になると思われるかもしれませんが、どのように D と c と B に沿って来たので、正しい出力は「BF」です。これを解決するのを手伝ってください

4

2 に答える 2