CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

晕,再问,ATL问题,怎么没人说得清呢

楼主kingoffighting()2006-06-02 12:58:28 在 VC/MFC / 基础类 提问

描述:  
  在使用ATL时,向接口中添加一个函数,ATL会自动把该函数弄成纯虚函数(可去工程头文件查看),这时的类就成了抽象类,抽象类是不能生成对象的,可是ATL却能生成COM对象,COM接口.   这是为什么呢,ATL到底是怎么实现这种封装的?它是怎么让抽象类生成对象的?  
   
  很难吧   :)   别说让我去看"深入解析ATL"了,在看一个扫描的电子版,半天没找到,不然就不问你们了. 问题点数:10、回复次数:9Top

1 楼ouyh12345(五岭散人)回复于 2006-06-02 13:05:32 得分 0

头文件是IMyCom.h  
  类的父类中有一个就是IMyCom。  
  例如:  
  #include   "IBju2DComponent.h"  
   
  class   BJU_DLL   Bju2DComponent  
  :  
          public   CComObjectRootEx<CComSingleThreadModel>,  
          public   CComCoClass<Bju2DComponent,   &CLSID_Bju2DComponent>,  
          public   VxrComplexComponent,  
          public   VxrObserverBaseClass  
  {  
  .....  
  };Top

2 楼steedhorse(晨星)回复于 2006-06-02 13:05:33 得分 10

能生成对象的类肯定是那个类的派生类,并且派生类实现了那个类中所有的纯虚函数。Top

3 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-06-02 13:11:04 得分 0

添加一个函数的时候   你的类就已经添加了这个函数,并且有空的实现Top

4 楼kingoffighting()回复于 2006-06-02 14:13:49 得分 0

非常谢谢各位,尤其是晨星的一句话让我有了一点灵感.   可能是这样的:  
   
  ATL实际生成的COM对象是我定义的类的派生类,   然后在客户端使用的是基类对象的指针,调用QueryInterface等方法时,正好实现C++中"基类指针指向派生类对象"的多态效果..  
   
  不知道对不对.Top

5 楼steedhorse(晨星)回复于 2006-06-02 14:34:25 得分 0

应该是这样的。  
  COM技术想达到的一个目的之一也就是“接口与实现”的分离嘛。然后就是所谓的“面向接口编程”。Top

6 楼kingoffighting()回复于 2006-06-02 14:36:25 得分 0

应该没错了吧,我已经实现了一个简单的模拟,不知道是不是想当然的,没什么信心,   :)  
   
  class   MyInterface //类A相当于我在ATL中定义的类/接口  
  {  
  public:  
  virtual   void   QueryInterface()=0;                 //从IUnknown继承来的函数  
  virtual   void   Add()=0; //自已往接口中添加的函数,ATL会自动设其为纯虚  
  };  
  void   MyInterface::Add()  
  {  
  cout<<"Add   of   class   A"<<endl; //很明显,我会自己实现添加进来的函数(这里是抽象类实现函数哦)  
  }  
   
  class   CovInterface:public   MyInterface //类B是ATL实际生成的COM对象时使用的类,它从A继承而来,这一切都是ATL封装完成的,  
  { //对程序员来说不可见的.  
  public:  
  void   QueryInterface();  
  void   Add();  
  };  
  void   CovInterface::QueryInterface() //类B自己实现系统函数QueryInterface.  
  {  
  cout<<"QueryInterface   of   class   CovInterface"<<endl;  
  }  
  void   CovInterface::Add() //这个虽然在A中已实现,但仍然必须再次重载,只是重载时只要简单调用基类已实现的  
  { //就可以了.  
  MyInterface::Add();  
  }  
   
  void   main()  
  {  
  MyInterface*pobj=NULL; //这个是在客户程序中的使用方式,我们就一个抽象类的指针,  
  CovInterface   bobj;  
  pobj=&bobj; //来获得的实际上是派生类的对象地址  
  pobj->QueryInterface(); //调用的要么是完全由派生类实现的方法  
  pobj->Add(); //要么是派生类实现时直接调用抽象类已实现方法的方法.  
  }  
   
  嘿嘿,看上去还有点天衣无缝的感觉哦.Top

7 楼steedhorse(晨星)回复于 2006-06-02 14:38:23 得分 0

而虽说COM与语言无关,但COM技术的许多实现细节借助于C++语方至少能更容易说清楚。Top

8 楼steedhorse(晨星)回复于 2006-06-02 14:38:58 得分 0

“语言”,打错了。Top

9 楼kingoffighting()回复于 2006-06-02 16:10:10 得分 0

哦,通过看ATL源代码,终于发现事实真相啦.  
  ATL中一个COM类可容纳多个接口,其实是通过继承这几个接口struct实现的.  
  所以一切变得合情全理,顺理成章,ATL并未再生成COM类的派生类,因为COM类本身实现了接口的所有纯虚函数,   只是QueryInterface等几个系统定义的方法由ATL封装实现.  
   
  揭帖了.  
  谢谢晨星.Top

相关问题

关键词

得分解答快速导航

  • 帖主:kingoffighting
  • steedhorse

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo