请教ATL中的一段代码有什么含义
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;
有什么区别呢?
为什么要这么写,有什么好处?