Ao implementar várias interfaces COM de uma só vez, como faço para passar para o IUnknown?
Suponha que meu objeto COM implemente duas ou mais interfaces COM:
class CMyClass : public IPersistFile, public IPersistStream {
};
ao implementar QueryInterface () eu preciso poder retornar um ponteiro IUnknown *. Uma vez que ambas as interfaces de base são derivadas de IUnknown, eu não posso fazer o upcast implicitamente - tal upcast seria umbiguous. Para fazer upcast explicitamente, eu preciso usar uma das duas maneiras:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}
ou
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}
Parece que o único requisito é que sempre que QI () for chamado em um objeto, ele retornará o mesmo ponteiro toda vez que eu atender a esse requisito, se eu escolher qualquer um dos elencos e apenas ficar com ele.
Qual upcast devo escolher e por quê?