请教ATL中的一段代码有什么含义

leechiyang 2008-03-27 11:28:31
ATL 中有如下代码:
[code=c/c++]

//////////////////////////////////////////////////////////////////////////////
// IObjectWithSite
//
template <class T>
class ATL_NO_VTABLE IObjectWithSiteImpl : public IObjectWithSite
{
public:
virtual ~IObjectWithSiteImpl()
{
}

STDMETHOD(SetSite)(IUnknown *pUnkSite)
{
ATLTRACE(atlTraceCOM, 2, _T("IObjectWithSiteImpl::SetSite\n"));
T* pT = static_cast<T*>(this);
pT->m_spUnkSite = pUnkSite;
return S_OK;
}
STDMETHOD(GetSite)(REFIID riid, void **ppvSite)
{
ATLTRACE(atlTraceCOM, 2, _T("IObjectWithSiteImpl::GetSite\n"));
T* pT = static_cast<T*>(this);
ATLASSERT(ppvSite);
HRESULT hRes = E_POINTER;
if (ppvSite != NULL)
{
if (pT->m_spUnkSite)
hRes = pT->m_spUnkSite->QueryInterface(riid, ppvSite);
else
{
*ppvSite = NULL;
hRes = E_FAIL;
}
}
return hRes;
}

HRESULT SetChildSite(IUnknown* punkChild)
{
if (punkChild == NULL)
return E_POINTER;

HRESULT hr;
CComPtr<IObjectWithSite> spChildSite;
hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&spChildSite);
if (SUCCEEDED(hr))
hr = spChildSite->SetSite((IUnknown*)this);

return hr;
}

static HRESULT SetChildSite(IUnknown* punkChild, IUnknown* punkParent)
{
return AtlSetChildSite(punkChild, punkParent);
}

CComPtr<IUnknown> m_spUnkSite;
};

[/code]

作用不难明白,但是SetSite中
T* pT = static_cast<T*>(this);
pT->m_spUnkSite = pUnkSite;

this->spUnkSite = pUnkSite;
有什么区别呢?
为什么要这么写,有什么好处?
...全文
142 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiuYinChina 2008-03-29
  • 打赏
  • 举报
回复
这种技术叫模拟动态绑定,见<深入解析ATL>第二版附录,
它可以在基类访问子类的成员,就是用静态的办法实现动态功能(虚函数),
ouyh12345 2008-03-27
  • 打赏
  • 举报
回复
static_cast <T*>
把static属性去掉
  • 打赏
  • 举报
回复
T* pT = static_cast <T*>(this);
pT->m_spUnkSite = pUnkSite;
会赋值到派生类的 m_spUnkSite


this->spUnkSite = pUnkSite;
赋值到本类或者基类的spUnkSite
jameshooo 2008-03-27
  • 打赏
  • 举报
回复
一般用处不大,主要是为了继承类可以重定义m_spUnkSite,如果没有重定义这个成员,就没有任何区别
cnzdgs 2008-03-27
  • 打赏
  • 举报
回复
举个例子说明一下:
// 定义两个类c1、c2,c2从c1派生
class c1
{
public:
char c;
};
class c2 : c1
{
public:
char c;
};
// 执行下面代码后,x、y的值是不同的。
c2 x2;
c1 *x1 = (c1 *)&x2;
x1->c = '1';
x2.c = '2';
char x = x1->c;
char y = x2.c;
  • 打赏
  • 举报
回复
是一般情况下,但也有例外情况。 :D
leechiyang 2008-03-27
  • 打赏
  • 举报
回复
这段代码还有别的作用吗?莫非微软想赋值到派生类的 m_spUnkSite ,一般也没有啊。

3,245

社区成员

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

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