我有以下层次的COM接口和一个类实现它们:
interface IX : public IUnknown{}; interface IY : public IUnknown{}; class CA: public IX, public IY{};
这里class CA
有效地inheritance了两次IUnknown
。
我们知道class CA
有两个vtable指针 – 一个指向IX
,另一个指向IY
。 所以存储在IX
子对象中的IUnknown
存储在IY
子对象中的IUnknown
不同。
然而,当我们在同一个对象上调用IX::QueryInterface()
或IY::QueryInterface()
并查询IUnknown
我们得到了相同的IUnknown*
指针。
为什么会发生?
这就是所谓的“对象身份”要求 ,它规定每当你从两个对象请求IUnknown
,如果这些是不同的对象和相同的指针(如果它们是相同的对象),你将得到不同的指针。
每个QueryInterface()
实现都必须满足这个要求。 这通常通过选择哪一个IUnknown
返回并坚持它来完成 :
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 } }