CComObjectRootBase中的FinalConstruct和union

gooore 2010-02-21 01:15:07

这里的FinalConstruct()不是纯虚函数,COM怎么保证它会有不一样的实现?

union语句是什么作用?

请帮忙通俗解释一下。谢过


// the functions in this class don't need to be virtual because
// they are called from CComObject
class CComObjectRootBase
{
public:
CComObjectRootBase()
{
m_dwRef = 0L;
}
HRESULT FinalConstruct()
{
return S_OK;
}


......

union
{
long m_dwRef;
IUnknown* m_pOuterUnknown;
};
...全文
66 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooore 2010-03-05
  • 打赏
  • 举报
回复
谢谢回复,

不过我认为正确的原因应该是ATL里面真正的COM应该是CComObject<Base>, 而不是base。

CComObject是直接继承直base的,所以会直接继承base的FinalConstruct()实现,而不是CComObjectRootBase,要知道CComObjectRootBase是它的老祖父级别的类了。
wshcdr 2010-03-04
  • 打赏
  • 举报
回复
引用 3 楼 gooore 的回复:
谢谢

问题是CComObjectRootBase不是模版啊。还有就是为什么模版不依赖 虚表 呢?


看一个例子

template <class T>
class Base
{
public:
void foo()
{
T* pT = static_cast<T*>(this);


pT->PrintClassName();
}

void PrintClassName() { cout << "This is Base"; }
};

class D1 : public Base<D1>
{


};

class D2 : public Base<D2>
{
void PrintClassName() { cout << "This is D2"; }
};

int main()
{
D1 d1;
D2 d2;

d1.foo();

d2.foo();


return 0;
}

以上是ATL中模板的用法
gooore 2010-02-26
  • 打赏
  • 举报
回复
求救。大家

谢谢


gooore 2010-02-21
  • 打赏
  • 举报
回复
谢谢

问题是CComObjectRootBase不是模版啊。还有就是为什么模版不依赖 虚表 呢?
wshcdr 2010-02-21
  • 打赏
  • 举报
回复
第二点不知...等高人
wshcdr 2010-02-21
  • 打赏
  • 举报
回复
我来第一点 ATL 是基于模板的东西,所以不依赖 虚表

简单来说就是,直接在子类中改写 FinalConstruct 就行了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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