При реализации IUnknown::QueryInterface()
в C ++ есть несколько предостережений с манипулированием указателями. Например, когда класс реализует несколько интерфейсов (множественное наследование), необходимы явные преобразования :
class CMyClass : public IInterface1, public IInterface2 {
};
//inside CMyClass::QueryInterface():
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IInterface1*>( this ); // upcast in order to properly adjust the pointer
//call Addref(), return S_OK
}
Причиной явного отклика достаточно ясно в сценариях множественного наследования. Однако время от времени я также вижу следующее:
static_cast<IUnknown*>( *ppv )->AddRef();
вместо простого вызова AddRef()
изнутри QueryInterface()
реализации.
Есть ли причина, по которой я должен выполнить приведение значения, ранее скопированного в ppv
, вместо того, чтобы просто вызывать AddRef()
для текущего объекта?