为什么“虚拟继承会导致产生与COM不兼容的vtbl”

解决方案 »

  1.   

    if the implemention class uses a virtual inheritance machenism, then the same base class on which the different base classes based  will be placed in the vtbl only once. This way, we can save quite a bit space. But the problem arises as different vendors of compilers always provide different machenisms in this matter, which can cause an in-compitability with COM.
      

  2.   

    -----如果是虚拟继承,则相同的基类在继承类里将只会出现一次----
    如果是这样的话,应该产生的vtbl与COM是兼容的吧。But the problem arises as different vendors of compilers always provide different machenisms in this matter, which can cause an in-compitability with COM.
    是什么意思?
    按照com规范,只要vtbl的前三个函数是QueryInterface,AddRef,ReleaseRef
    就可以啊?
      

  3.   

    根据inside the C++ object model中所述,C++标准没有规定虚继承的实现标准,所以各厂商的C++编译器对于虚继承有不同的实现,一个C++编译器所产生的组件,往往不符合COM模型!
      

  4.   

    按照COM的规范,每一个接口有都要从IUnknown继承,如果一个组件类从两个接口继承,该组件类内应该有两个IUnknown接口;如果用了虚拟继承,组件类内将只会有一个IUnknown接口,不符合COM的规范。
      

  5.   

    To IKKI_SHUN(IKKI):
    我觉得仍然符合,COM规范只规定接口指针VTBL的前三个地址必须为IUnknown的三个函数,但并没有规定其如何实现
      

  6.   

    gularess(无吃哪拉) 说的我补充一些。对于虚继承各个编译器确实实现的方式不同。如微软的Visual C++是通过在每个带有虚基类的类的实例中增加一个隐藏的vbptr(虚基类指针)域来实现这个技术的。这个指针指向一个共享的、每个虚基类占一项的表,表中是vbptr域的地址指针到类中虚基类的偏移量。其它的一些实现采用了在继承类中指向其虚基类的内嵌指针,为每个虚基类分配一个指针。这种描述方式可以以更少的代码来定位虚基类,但是现今代码优化器常常可以消除对访问虚基类的重复计算。它的不利之处则是如果有多个虚基类的话,其类的实例大小将会变得比较大,而且对于虚基类的虚基类的访问会很慢(除非再引入更多的隐藏指针~~),当引用成员时也需要更多的指针。总之,是在类中间添加隐藏的额外变量来实现虚继承的。这和COM接口规范有冲突。COM接口不允许有成员变量的。
      

  7.   

    讨论请致 [email protected] 或短信