Cuando se implementan varias interfaces COM a la vez, ¿cómo puedo hacer un upcast a IUnknown?

Supongamos que mi objeto COM implementa dos o más interfaces COM:

class CMyClass : public IPersistFile, public IPersistStream {
};

al implementar QueryInterface () necesito poder devolver un puntero IUnknown *. Dado que ambas interfaces de base se derivan de IUnknown, no puedo realizar una transmisión implícita de manera implícita, ya que dicha actualización sería unívoca. Para realizar una actualización explícita, necesito utilizar una de las dos formas siguientes:

 if( iid == __uuidof( IUnknown ) ) {
     *ppv = static_cast<IPersistFile*>( this );
     static_cast<IPersistFile*>( this )->AddRef();
     return S_OK;
 }

o

 if( iid == __uuidof( IUnknown ) ) {
     *ppv = static_cast<IPersistStream*>( this );
     static_cast<IPersistStream*>( this )->AddRef();
     return S_OK;
 }

Parece que el único requisito es que cada vez que se llama a QI () en un objeto, devuelve el mismo puntero cada vez y cumplo ese requisito si elijo cualquiera de los lanzamientos y me atengo a él.

¿Qué upcast debo elegir y por qué?

Respuestas a la pregunta(4)

Su respuesta a la pregunta