使用隐式转换进行upcast而不是QueryInterface()合法使用多重继承?

sha*_*oth 5 c++ windows com multiple-inheritance visual-c++

假设我有实现两个或多个COM接口(完全是一类在这里):

class CMyClass : public IInterface1, public IInterface2 { 
};
Run Code Online (Sandbox Code Playgroud)

QueryInterface() 必须为同一个接口的每个请求返回相同的指针(它需要一个显式的upcast以进行正确的指针调整):

if( iid == __uuidof( IUnknown ) ) { 
    *ppv = static_cast<IInterface1*>( this );
    //call Addref(), return S_OK 
} else if( iid == __uuidof( IInterface1 ) ) {
    *ppv = static_cast<IInterface1*>( this );
    //call Addref(), return S_OK 
} else if( iid == __uuidof( IInterface2 ) ) {
    *ppv = static_cast<IInterface2*>( this );
    //call Addref(), return S_OK 
} else {
    *ppv = 0;
    return E_NOINTERFACE;
}
Run Code Online (Sandbox Code Playgroud)

现在IUnknown对象中有两个- 一个是基础,IInterface1另一个是基础IInterface2.而他们在不同的子对象.

让我们假设我打电话QueryInterface()IInterface2-返回的将是从指针不同的指针返回当我打电话QueryInterface()IUnknown.到现在为止还挺好.然后我可以通过将检索IInterface2*到的任何函数接受IUnknown*并由于C++的隐式转换的指针将被接受,但将不是相同的指针QueryInterface()用于IUnknown*将检索.事实上,如果该函数调用QueryInterface()IUnknown在被调用时,它将检索不同的指针马上.

这在COM方面是合法的吗?当我有一个指向多重继承对象的指针并允许隐式向上转换时,如何处理这种情况?

Han*_*ant 3

COM 没有关于接口标识的规则,只有对象标识。QI 的第一条规则规定,如果两个接口指针上的 IID_Unknown 上的 QI 由同一对象实现,则它们必须返回相同的指针。您的 QI 实施正确地做到了这一点。

如果没有接口标识的保证,COM 方法就不能假定它获取的 IUnknown 指针与它在该指针上调用 QI 时将检索的指针相同。因此,如果需要证明对象身份,则需要单独的 QI。