为什么通过同一COM对象的不同接口检索的IUnknown *指针具有相同的值?

时间:2011-04-22 06:51:26

标签: c++ windows inheritance com multiple-inheritance

我有以下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*指针。

为什么会这样?

1 个答案:

答案 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
    }
}