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

kingoffighting 2006-06-02 12:58:28
描述:
在使用ATL时,向接口中添加一个函数,ATL会自动把该函数弄成纯虚函数(可去工程头文件查看),这时的类就成了抽象类,抽象类是不能生成对象的,可是ATL却能生成COM对象,COM接口. 这是为什么呢,ATL到底是怎么实现这种封装的?它是怎么让抽象类生成对象的?

很难吧 :) 别说让我去看"深入解析ATL"了,在看一个扫描的电子版,半天没找到,不然就不问你们了.
...全文
129 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingoffighting 2006-06-02
  • 打赏
  • 举报
回复
哦,通过看ATL源代码,终于发现事实真相啦.
ATL中一个COM类可容纳多个接口,其实是通过继承这几个接口struct实现的.
所以一切变得合情全理,顺理成章,ATL并未再生成COM类的派生类,因为COM类本身实现了接口的所有纯虚函数, 只是QueryInterface等几个系统定义的方法由ATL封装实现.

揭帖了.
谢谢晨星.
晨星 2006-06-02
  • 打赏
  • 举报
回复
“语言”,打错了。
晨星 2006-06-02
  • 打赏
  • 举报
回复
而虽说COM与语言无关,但COM技术的许多实现细节借助于C++语方至少能更容易说清楚。
kingoffighting 2006-06-02
  • 打赏
  • 举报
回复
应该没错了吧,我已经实现了一个简单的模拟,不知道是不是想当然的,没什么信心, :)

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(); //要么是派生类实现时直接调用抽象类已实现方法的方法.
}

嘿嘿,看上去还有点天衣无缝的感觉哦.
晨星 2006-06-02
  • 打赏
  • 举报
回复
应该是这样的。
COM技术想达到的一个目的之一也就是“接口与实现”的分离嘛。然后就是所谓的“面向接口编程”。
kingoffighting 2006-06-02
  • 打赏
  • 举报
回复
非常谢谢各位,尤其是晨星的一句话让我有了一点灵感. 可能是这样的:

ATL实际生成的COM对象是我定义的类的派生类, 然后在客户端使用的是基类对象的指针,调用QueryInterface等方法时,正好实现C++中"基类指针指向派生类对象"的多态效果..

不知道对不对.
  • 打赏
  • 举报
回复
添加一个函数的时候 你的类就已经添加了这个函数,并且有空的实现
晨星 2006-06-02
  • 打赏
  • 举报
回复
能生成对象的类肯定是那个类的派生类,并且派生类实现了那个类中所有的纯虚函数。
ouyh12345 2006-06-02
  • 打赏
  • 举报
回复
头文件是IMyCom.h
类的父类中有一个就是IMyCom。
例如:
#include "IBju2DComponent.h"

class BJU_DLL Bju2DComponent
:
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<Bju2DComponent, &CLSID_Bju2DComponent>,
public VxrComplexComponent,
public VxrObserverBaseClass
{
.....
};

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧