Предположим, что у меня есть класс, реализующий два или более COM-интерфейса:
class CMyClass : public IInterface1, public IInterface2 {
};
Почти каждый документ, который я видел, показывает, что когда я реализую QueryInterface() для IUnknown, я явно повышаю этот указатель на один из интерфейсов:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IInterface1>( this );
//call Addref(), return S_OK
}
Вопрос в том, почему я не могу просто скопировать это?
if( iid == __uuidof( IUnknown ) ) {
*ppv = this;
//call Addref(), return S_OK
}
В документах обычно говорится, что если я сделаю последнее, я нарушу требование о том, что любой вызов QueryInterface() на том же объекте должен возвращать точно такое же значение.
Я не совсем понимаю. Они означают, что если я QI() для IInterface2 и вызовет QueryInterface() через этот указатель С++, это будет немного отличаться от if я QI() для IInterface2, потому что С++ будет каждый раз делать эту точку в подобъекте?