none
《Com本质论》的一个问题 RRS feed

  • 问题

  • 《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的思路是有问题的,按照这种思路,COM连C++编译器独立这一层都没跨过去,更别论提供二进制接口了

     

     


    前无古人,后无来者
    2011年7月24日 14:24

答案

  • 没有看到哪里有冲突啊,支持COM的编译器纯虚函数的位置需要一样,但是不需要支持COM的编译器就可以自由决定虚函数表的结构。这个属于编译器自由决定的范围,不属于C++标准。就跟你在北方说普通话别人都听得懂,在南方不说粤语就未必有人听懂一样,别人生活未必需要懂普通话。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Rob Pan 2011年8月4日 9:38
    2011年7月29日 16:53
    版主

全部回复

  • COM是独立于C++的事实标准,想要支持COM的C++编译器就得这么编译,不然不能调用COM。当然,在不需要支持COM的环境,比如针对在芯片里面运行的程序的编译器,就不用受这个限制。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年7月24日 15:36
    版主
  • 编译器只是决定虚函数的结构,而虚函数的功能在标准中有定义。而COM只是使用了该功能。所以与编译器的实现无关。


    麻烦把正确答案设为解答。
    2011年7月25日 1:41
    版主
  • 编译器只是决定虚函数的结构,而虚函数的功能在标准中有定义。而COM只是使用了该功能。所以与编译器的实现无关。


    麻烦把正确答案设为解答。

          大侠,说明要支持COM标准,是需要C++编译器支持的。

    前无古人,后无来者
    2011年7月25日 2:21
  • 编译器只是决定虚函数的结构,而虚函数的功能在标准中有定义。而COM只是使用了该功能。所以与编译器的实现无关。


    麻烦把正确答案设为解答。

          大侠,说明要支持COM标准,是需要C++编译器支持的。

    前无古人,后无来者


    搞不清楚你的疑问。。COM 仅是一种标准,若编译器编译出来的东西,支持这种标准,则能够是用; 不支持这一标准,则不能使用。

    Microsoft 和 Borland 的编译器支持这一标准。所以它们能够编译出 COM 组件。 如果你自己写一个编译器,不支持 COM 标准,那样自然编译不出 COM 组件。

     

    当然,调用者也要根据统一标准调用。


    学习学习....
    2011年7月26日 9:28



  • 编译器只是决定虚函数的结构,而虚函数的功能在标准中有定义。而COM只是使用了该功能。所以与编译器的实现无关。


    麻烦把正确答案设为解答。

          大侠,说明要支持COM标准,是需要C++编译器支持的。

    前无古人,后无来者


    搞不清楚你的疑问。。COM 仅是一种标准,若编译器编译出来的东西,支持这种标准,则能够是用; 不支持这一标准,则不能使用。

    Microsoft 和 Borland 的编译器支持这一标准。所以它们能够编译出 COM 组件。 如果你自己写一个编译器,不支持 COM 标准,那样自然编译不出 COM 组件。

     

    当然,调用者也要根据统一标准调用。


    学习学习....
            兄弟,我是说要支持COM标准,是需要C++编译器支持的。这个没有错吧。我的疑问源自在网上下载了一个pptCOM是一个更好的C++》,在提到使用C++实现COM时,提到一个方案:方案1:将析构函数声明为纯虚函数,但纯虚函数在vbtl中的位置随编译器不同而不同(原文就是这样)。这句话是有问题的,因为如果纯虚函数在vbtl中的位置随编译器不同而不同,上文说的抽象基类做为二进制接口的做法就变得毫无意义了。因此我怀疑这句话应该为:方案1:将析构函数声明为纯虚函数,但纯虚析构函数在vbtl中的位置随编译器不同而不同。我上论坛问了问,后来发现这个ppt的内容主要来自于《COM本质论》这本书。这本书对这个问题说得很清楚。
    前无古人,后无来者
    2011年7月29日 12:44
  • 没有看到哪里有冲突啊,支持COM的编译器纯虚函数的位置需要一样,但是不需要支持COM的编译器就可以自由决定虚函数表的结构。这个属于编译器自由决定的范围,不属于C++标准。就跟你在北方说普通话别人都听得懂,在南方不说粤语就未必有人听懂一样,别人生活未必需要懂普通话。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Rob Pan 2011年8月4日 9:38
    2011年7月29日 16:53
    版主