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ê?

questionAnswers(4)

yourAnswerToTheQuestion