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

ken*_*nny 3 c++ windows com inheritance multiple-inheritance

我有以下COM接口层次结构和一个实现它们的类:

interface IX : public IUnknown{};
interface IY : public IUnknown{};
class CA: public IX, public IY{};
Run Code Online (Sandbox Code Playgroud)

这里class CA有效地继承了IUnknown两次.

我们知道有两个vtable指针class CA- 一个指向IX,另一个指向IY.因此IUnknown存储在IX子对象中与IUnknown存储在IY子对象中不同.

然而,当我们调用IX::QueryInterface()IY::QueryInterface()在相同的对象和查询时,IUnknown我们得到相同的IUnknown*指针.

为什么会这样?

sha*_*oth 7

这就是所谓的"对象标识"要求,它规定无论何时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
    }
}
Run Code Online (Sandbox Code Playgroud)