Предположим, что мой COM-объект реализует два или более COM-интерфейса:
class CMyClass : public IPersistFile, public IPersistStream {
};
при реализации QueryInterface () мне нужно иметь возможность вернуть указатель IUnknown *. Так как оба базовых интерфейса являются производными от IUnknown, я не могу неявно выгружать - такой выгрузка будет неясной. Для явного отката мне нужно использовать любой из двух способов:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}
или
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}
Похоже, что единственным требованием является то, что всякий раз, когда QI () вызывается для объекта, он каждый раз возвращает один и тот же указатель, и я выполняю это требование, если я выбираю какое-либо из приведений и просто придерживаюсь его.
Какой upcast я должен выбрать и почему?