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