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.F1 为什么a.,b,c要实例化d的对象?实际应用中也经常见到这种用法,不知是为什么?
因为我们一般都是 A a=new A();这么用,为什么要A a=new B()呢?这样做有什么用途?2 解释一下输出结果为什么是这样?我感觉既然是都实例化了D的对象d,那么d.F()就都
应该是:
D.F
D.F
D.F
D.F
请教高手,给解释一下上面的问题,感谢!!!

解决方案 »

  1.   

    如果你以前学过C++的话,其实你上面的代码,可以如下:
    using System;
    class A
    {
    public virtual void F() ;
    }
    class B: A
    {
    public override void F() { Console.WriteLine("B.F"); }
    }
    class C: B
    {
    new public virtual void 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();
    }
    }这样你会更清楚些
      

  2.   

    同时要注意Virtual类,即仅含有Virtual函数的类为Virtual类,是不能实例化的。
      

  3.   

    不知道Knight94(愚翁)的解答对楼主有多少帮助这个例子其实就是告诉重载override和复盖new的区别。其中关键点在于类C中
    class C: B
    {
       new public virtual void F() { Console.WriteLine("C.F"); }
    }
    意思是在类C中,覆盖其父类B的同名方法F(),也就是说,C中的F()与B中的F()没有关系了,已是新定义的方法了,只是名字相同而已。同时,C类中该方法被定义为virtual,以便在类D中可以重载。
      

  4.   

    同时要注意Virtual类,即仅含有Virtual函数的类为Virtual类,是不能实例化的
    -------
    我还没听过有Virtual类的,是不是vs2005的功能?
      

  5.   

    MyLf(不睡觉的鱼)已经说的很清楚了
    Knight94(愚翁)说的是不是抽象类abstract关键字啊,呵呵