《Com本质论》上写:虚析构函数在vbtl中的位置随编译器不同而不同。除开虚析构函数,一般虚函数(包括纯虚函数)在vbtl中的位置不会随编译器不同而不同。这个也是COM能够实现的基础。  上面我说的有点抽象,我举个例子吧:
class BaseString
{
public:    virtual ~BaseString() = 0{}
    virtual int GetLen() = 0;
    virtual int Find(const TCHAR *psz) = 0;
};class MyString:public BaseString
{
public:     ~MyString() {}
     int GetLen(){}
     int Find(const TCHAR *psz){}
};    但我问了C++版的高手,他们说C++标准对vtable实现是没规定的。也就是虚函数(包括纯虚函数)在vbtl中的位置可以变化也可以不变化,这个取决于编译器。这么说《COM本质论》中讨论使用C++实现COM的思路是有问题的。

解决方案 »

  1.   

    这个其实不用太较真,COM实现不一定用C++的,使用C也是可以写COM的。
    虽然C++标准没规定,但主流的编译器实现都是一样的
      

  2.   


         兄弟,这个不对吧。我觉得凡是COM支持的语言都是可以实现COM的机制的。
      

  3.   


    不是COM支持语言
    是语言支持COM,只要你按微软的COM标准实现就可以了,至于你用C++还是C,甚至是汇编是没关系的
      

  4.   

    这也是为什么接口要用IUnKnown,IDispatch来派生了,而且QueryInterface,AddRef,Release的顺序都是固定的。而且接口定义的一个原则是不能多重继承
      

  5.   

    COM是保证抽象上的外层接口统一,至于内部的实现是由开发者决定的
    至于虚函数的地址变化,可以参考《深入探索C++对象模型》,里面讲了几种主流编译器的虚表实现,不变化已经成为事实上的标准了
      

  6.   

    主流的就两种vtbl规范,而在一种平台上主要就一种规范。如果某种x86的编译器采用CFRONT,那么确实是会出问题。