大家知道win32中iunknown定义如下:   
  interface   iuknown   
  {   
        virtual   hresult   _stdcall   queryinterface(const   iid&   iid,void**   ppv)   =0;   
        virtual   ulong   _stdcall   addref()   =   0;   
        virtual   ulong   _stdcall   release   =   0;   
  };   
    
  可是在“com技术内幕”p31页中明确指出:   
  iunknown并不是虚拟基类,不能被虚拟继承,否则会导致与com不兼容的vtbl.如果一个组件从两个接口继承,如果Iunknown不用虚拟继承的话,那么会产生两个Iunknown了,这不是违背了一个组件一个Iunknown吗?

解决方案 »

  1.   

    COM的继承,有自己的规范,不会产生二义性,因为所有的IUnknow都是一样的
      

  2.   

    com规范中,那是不是定义了Iunknown所有的都是一样的,然后就不用考虑C++ 的继承关系了?
    然后就是 被虚拟继承,否则会导致与com不兼容的vtbl 这句话讲的不兼容的Vtbl,是怎么回事呢?
      

  3.   

    COM强制是不能虚拟继承的,然后他自己在QueryInterface里有一个特定的向上转换,不会直接到IUnknow,被转换到一个实现类后再转换到IUnknown
      

  4.   

    先说为什么引入虚拟基类(虚基类),它和虚函数没有关系,虚函数主要是为了解决多态的问题。
    虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类,如: 
    class B 

    }; 
    class D1 : public B 

    }; 
    class D2 : public B 

    }; 
    class C: public D1, public D2 

    }; 
    这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,即: 
    class B 

    }; 
    class D1 : virtual public B 

    }; 
    class D2 : virtual public B 

    }; 
    class C: public D1, public D2 

    };这样就可以回答后面的问题了,假如IX和IY按需你方式继承IUnknown,那么IX和IY的vtbl的头三个函数指向的就不是......了。
    不知道说清楚了没有,我也是刚刚开始学习COM
      

  5.   

    这里C在D1,D2上继承,但有两个基类,造成混乱。因而使用虚基类,问题是COM没有使用虚基类,你还在解释使用虚基类。