rt,看到47页,有一问题不大明白,看到IUnknown接口的定义,它明明就是一个纯虚基类。但是书上却特地搞个方框出来强调:

非虚拟继承:
注意IUnknown并不是虚拟基类。IX和IY并不能按虚拟方式继承IUnkown,这是由于会导致与COM不兼容的vtbl.若IX和IY按虚拟方式继承IUnkonw,那么IX和IY的vtbl重的头三个函数指向的将不是IUnkonwn的三个成员函数。”请问怎么理解这个问题,谢谢了

解决方案 »

  1.   

    如果IX IY的实现是CA来完成的,并且如果是虚拟继承的话
    在CA中必然会破坏IX或者IY中某一个的IUnknown
    那么再把CA转换为IX和IY成为接口,此时就出问题了,IX IY中至少有一个的头三个函数不是IUnknown的那三个
      

  2.   

    PS:虚拟继承
    interface IX : virtual public IUnknown
    {
    };
      

  3.   

    to kvls(冰茶)
    我说的意思是"...注意IUnknown并不是虚拟基类"这句话,它明明是个纯虚拟基类啊,为什么不是虚拟基类
      

  4.   

    哦,我有点明白你的意思了,是不是应该这样说,IUnknown只是纯抽象基类,而不是纯虚拟基类?纯虚拟基类是相对它的派生类来说的,如果它的派生类是虚拟继承的,就称它为虚拟基类,是这样理解么?纯抽象类和纯虚拟类有区别么,我怎么感觉两者是一回事啊!
      

  5.   

    你前面说的差不多
    不过还有点意思的是在VC6中对IUnknown的定义中,还包含了一个模板函数
      

  6.   

    只要一个类含有纯虚函数,就可以被称为抽象类.目的是为所有派生(继承)类提供一种定义,使该方法形态多样化。所以IUnknown是一个抽象类.注意一点,因为IUnknown是作为基类来使用,所以叫抽象基类.
    虚拟基类,算是一种继承方式,如果虚拟继承的话,它的基类就成为虚拟基类.注意一点,叫做虚拟基类,没有虚拟类的说法吧