例子是MSDN上的:
http://msdn.microsoft.com/zh-cn/library/ms173152%28VS.80%29.aspxpublic class A
{
    public virtual void DoWork() { }
}
public class B : A
{
    public override void DoWork() { }
}
public class C : B
{
    public override void DoWork() { }
}
public class D : C
{
    public new void DoWork() { }
}根据MSDN的说法,就是:
如果使用类型为 C、B 或 A 的变量访问 D 的实例,对 DoWork 的调用将遵循虚拟继承的规则,即把这些调用传送到类 C 的 DoWork 实现。那么就是说定义A a=new D();a.DoWork()将会调用C.DoWork().我的问题就是:在这样的情况下,到底是什么样的"虚拟继承的规则"决定了a对象调用的既不是D也不是A,剩下的也不选B,而是调用C的DoWork?这样的规则又有什么意义呢?

解决方案 »

  1.   

    我觉得这里主要探讨的是重写和覆盖 因为类D里的方法是NEW(即为覆盖) 所以A的指针a只能指向到继承了自己的最底层一级的C类那里。。别的没什么可说的
      

  2.   

    override void DoWork()只被继承到了C   D中的 void DoWork()不是重载出来的,所以你使用a.DoWork就只能调用C中的DoWork
      

  3.   


    规则就是:调用a的变量声明类型——A——的接口方法实现,而不一定是a的变量实现类型——D——的new出来的方法。实际上,我觉得.net的这个new方法很愚蠢。我想微软当初是想吸引c++程序员。可是这个东西实在是“一锅汤里的一块老鼠屎”,把面向对象继承的概念在.net平台上搞出了一个巨大的破洞和特例。
      

  4.   

    虚拟方法优点是可以在子类中重新定义你要重载的方法,
    但是你在超类中也可以在该虚拟方法中自动要其实现的方法,
    这样做的好处就是当你有必要调用超类中的虚拟方法是可以利用this.方法名()来调用超类中的
    虚拟方法,试一下应该可以(在子类中的使用看看!!)我这边没有C#运行环境,试试吧!注:this所调用的是本类的实例化的该对象,对本类的其他实例没有影响。 
      

  5.   

    CSDN告诉我
    每天回帖即可获得10分可用分!
      

  6.   


    确实是继承体系的类型系统限制5#觉得.NET搞这种体系是很烂的设计么,水平有限理解不了啊...
      

  7.   

    对new的理解可能稍微有点困扰,但是根据我自己的理解我想还是可以分辨清楚的,
    首先A a=new D();
    a.DoWork()使用的是A的引用,D的实例,
    如果D中还有一些其它属性和方法,其实a是无法调用的,
    假设D中没有public new void DoWork() { } ,
    大家基本都会毫无疑惑地认为调用的是c.Dowork(),
    现在在来看 这个new, new就是覆盖,就是和父类一样的方法脱离了关系,
    那么通过A的引用调用虚方法Dowork()是绝对不会调用到D.Dowork,因为它们脱离了关系。
    这样把new出来的方法直接看成是不同名的方法,在理解多态时就不会有这个困扰了。
    我觉得微软之所以要引进new的这个用法,是为了保证可能出现的版本兼容性问题。
    这个我在框架设计这本书上看到过,有兴趣的可以翻一下。