我有以下COM接口层次结构和一个实现它们的类:
interface IX : public IUnknown{};
interface IY : public IUnknown{};
class CA: public IX, public IY{};
此处class CA
有效地从IUnknown
继承了两次。
我们知道class CA
中有两个vtable指针 - 一个指向IX
,另一个指向IY
。因此,存储在IUnknown
子对象中的IX
与存储在IUnknown
子对象中的IY
不同。
然而,当我们在同一个对象上调用IX::QueryInterface()
或IY::QueryInterface()
并查询IUnknown
时,我们会得到相同的IUnknown*
指针。
为什么会这样?
答案 0 :(得分:7)
这就是所谓的"object identity" requirement,它指出无论何时从两个对象请求IUnknown
,如果那些是不同的对象,则会获得不同的指针,如果它们是相同的对象,则会得到相等的指针。
每个QueryInterface()
实施都必须满足此要求。这通常由choosing which one IUnknown
to return and sticking to it完成:
HRESULT CA::QueryInterface( REFIID iid, void** ppv )
{
if( iid == __uuidof( IUnknown ) ) {
// Explicitly cast to one of base class subobjects.
// Doesn't matter which one is chosen - it just has to be
// the same base class subobject each time IUnknown is requested.
IUnknown* selected = static_cast<IX*>( this );
*ppv = selected;
AddRef();
return S_OK;
} else {
continue for other interfaces
}
}