描述:
最近在看《COM原理与应用》的聚合部分,其实现过程有一部分不是很理解,希望了解的的同学能给说明一下,谢谢.
HRESULT CA::NondelegationQueryInterface(const IID& iid, void **ppv)
{
if ( iid == IID_IUnknown )
{
*ppv = (INondelegatingUnknown *) this ;
((IUnknown *)(*ppv))->AddRef() ; // 这里实际调用的是AddRef还是NondelegatingAddRef?
} else if ( iid == IID_SomeInterface )
{
*ppv = (ISomeInterface *) this ;
((ISomeInterface *)(*ppv))->AddRef() ;
}
else
{
*ppv = NULL;
return E_NOINTERFACE ;
}
return S_OK;
}
说明:CA是被聚合的类。假设还有一个类CB,是用来聚合CA的
按照我的理解,CA和CB的引用计数都是在CB中统计的,但我感觉上面部分的代码(((IUnknown *)(*ppv))->AddRef())调不到CB的AddRef,我试了一下,它实际调用的是CA::NondelegatingAddRef,难道CA和CB的引用计数是各自独立统计的么?这和我对聚合应用计数的理解是有偏差的?
CA的继承结构如下:
class INondelegatingUnknown
{
public:
virtual HRESULT __stdcall NondelegationQueryInterface(const IID& iid, void **ppv) = 0 ;
virtual ULONG __stdcall NondelegatingAddRef() = 0;
virtual ULONG __stdcall NondelegationRelease() = 0;
};
class CA : public ISomeInterface, public INondelegatingUnknown
{
protected:
ULONG m_Ref;
public:
CA(IUnknown *pUnknownOuter);
~CA();
public :
// Delegating IUnknown
virtual HRESULT __stdcall QueryInterface(const IID& iid, void **ppv) ;
virtual ULONG __stdcall AddRef() ;
virtual ULONG __stdcall Release() ;
// Nondelegating IUnknown
virtual HRESULT __stdcall NondelegationQueryInterface(const IID& iid, void **ppv);
virtual ULONG __stdcall NondelegatingAddRef();
virtual ULONG __stdcall NondelegationRelease();
virtual HRESULT __stdcall SomeFunction( ) ;
private :
IUnknown *m_pUnknownOuter; // pointer to outer IUnknown
};
ISomeInterface继承了IUnknown接口。