COM实现聚合所使用的C++技巧

原创 2004年08月29日 19:11:00

COM聚合作为COM实现接口复用的一种手段, 在进行多接口转发的时候是一种有效而快速的方法; 不过要在转发之后保证接口函数的语意保持一致, 必须使用一些特定的技巧, 下面的代码就演示了COM在实现聚合时所使用的技巧:

class Base

{

public:

    virtual void Output()

    {

        printf("Base::Output/n");

    }

};

 

class BaseEx

{

public:

    virtual void Print()

    {

        printf("BaseEx::Print/n");

    }

};

 

class Derive : public Base, public BaseEx

{

public:

    void QI(void ** p)

    {

        *p = (Base*)this;

    }

};

 

int main(int argc, char* argv[])

{

    Derive obj;

    BaseEx * p;

    obj.QI((void**)&p);

    p->Print();

    return 0;

}

 

你可以自己运行一下代码, 看看实际的输出结果哦:

Base::Output

正如你所看到的, 明明我调用的是BaseEx类指针的Print函数, 但是从输出结果上看, 它实际调用的却是Base类的Output函数! 那它是怎么做到的呢? 那么我想你应该从Derive类的QI函数的实现看到了奥秘吧? 那为什么它能够做到这种巧妙的转移呢? 这是由于C++的虚函数调用决定的(关于这一点, 你看看我的文章C++虚函数调用的反汇编解析》一问). COM实现聚合的过程中就使用了这一技巧来保证QueryInterface方法的语意正确!

COM技术内幕学习笔记---第八章---组件复用:包容和聚合

COM 不支持实现继承的原因在于这种继承方式将 使得一个对象的实现同另外一个对象的实现紧紧地关联起来。 在这种情况下,当基类的实现被修改之后,派生类将无法正常运行而必须被修改。对于一个中等规模的C+...
  • shb8845369
  • shb8845369
  • 2014年04月08日 15:06
  • 1305

c++ 调用com的方式

一、在需要的文件中引入com对应
  • angellove156
  • angellove156
  • 2014年05月12日 17:31
  • 4466

C++ COM组件编写初探

最近在学习COM,自己实现了一个小Demo,拿出来和大家分享一下。求各种批评。 我实现的这个组件向外提供了一个接口ICompTest,里面只有一个函数helloworld(),功能为返回一个整数...
  • shejiannan
  • shejiannan
  • 2014年05月20日 17:41
  • 847

关联,聚合,组合的区别及C++实现

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gamecreating/archive/2010/03/22/5404589.aspx   关联,聚合,组...
  • luliyuan
  • luliyuan
  • 2015年09月21日 15:25
  • 1916

c++中调用Com组件的方法详解

 转载自:http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html 需求: 1.创建myCom....
  • u011555996
  • u011555996
  • 2017年07月25日 15:19
  • 1601

c++到com组件过度(一个实例)

从C++过度到com需要经历的过程: 实现接口的引用计数 对象允许多个接口 类厂对象使用标准IClassFactory接口使用_stdcall调用约定实现DLL动态卸载实现对象自注册...
  • cherry_ermao
  • cherry_ermao
  • 2016年09月20日 11:34
  • 1473

com 聚合的实现

COM接口聚合实现解惑(C++虚表) 标签: c++nullclass工作serverc 2009-10-12 17:37 1829人阅读 评论(8) 收藏 举报 ...
  • ICE_CHB
  • ICE_CHB
  • 2016年06月24日 17:54
  • 70

ATL 实现com的聚合

com聚合是包容的一种特例,目的是最大化的实现功能模块话,降低组件间的耦合性。 第一步:          通过ATL创建com外部组件TestOutCom.dll,在其内部创建接口包装类CCMyOu...
  • FrankieWang008
  • FrankieWang008
  • 2014年06月11日 17:32
  • 2346

创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件              1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支...
  • jiangqin115
  • jiangqin115
  • 2015年09月08日 09:31
  • 764

关于聚合的几个例子

连续聚合是按时间顺序对有序数据时行聚合的操作。它有几个变体: 累积聚合,滑动聚合,年初至今聚合 累积聚合:聚合从序列内第一个元素到当前元素的数据,如为每个员工返回每月开始到现在累积的订单数量和平均订单...
  • u013393981
  • u013393981
  • 2014年01月13日 22:42
  • 354
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM实现聚合所使用的C++技巧
举报原因:
原因补充:

(最多只允许输入30个字)