晕,再问,ATL问题,怎么没人说得清呢
描述:
在使用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




