为什么通过同一个COM对象的不同接口获取的I​​Unknown *指针具有相同的值?

我有以下层次的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 } }