class CMyClass : public IInterface1, public IInterface2 {
};
QueryInterface()
必须为同一接口的每个请求返回相同的指针(需要显式向上转换以进行正确的指针调整):
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;
}
现在对象中有两个
IUnknown
- 一个是IInterface1
的基础,另一个是IInterface2
的基础。而且它们位于不同的子对象中。假设我调用了
IInterface2
的QueryInterface()
- 返回的指针将与调用IUnknown
的QueryInterface()
时返回的指针不同。到目前为止还好。然后,我可以将检索到的IInterface2*
传递给任何接受IUnknown*
的函数,由于C++的隐式转换,指针将被接受,但它不会是与QueryInterface()
调用IUnknown*
返回的指针相同。实际上,如果该函数在调用时立即调用QueryInterface()
以获取IUnknown
,它将检索到不同的指针。从COM的角度来看,这合法吗?当我有一个指向多重继承对象的指针并允许隐式向上转换时,我应该如何处理情况?