Warum genau muss ich eine explizite Verallgemeinerung bei der Implementierung von QueryInterface() in ein Objekt mit mehreren Schnittstellen()

Angenommen ich habe eine Klasse die zwei oder mehr COM-Schnittstellen:

class CMyClass : public IInterface1, public IInterface2 {
};

Fast jedes Dokument, das ich sah, deutet darauf hin, dass, wenn ich die Implementierung von QueryInterface() für IUnknown ich ausdrücklich Verallgemeinerung diese Zeiger auf eine der Schnittstellen:

if( iid == __uuidof( IUnknown ) ) {
     *ppv = static_cast<IInterface1>( this );
     //call Addref(), return S_OK
}

Die Frage ist, warum kann ich nicht einfach kopieren diese?

if( iid == __uuidof( IUnknown ) ) {
     *ppv = this;
     //call Addref(), return S_OK
}

Die Dokumente in der Regel sagen, dass, wenn ich letzteres tun, werde ich gegen die Forderung, dass jeder Aufruf von QueryInterface() auf das gleiche Objekt muss wieder genau den gleichen Wert.

Ich nicht ganz verstehe. Bedeuten Sie, dass, wenn ich QI() für IInterface2 und rufen Sie QueryInterface() durch, der Zeiger C++ passieren diese etwas anders aus, wenn ich QI() für IInterface2, da C++ wird jedes mal machen diese Punkt, um ein Unterobjekt?

  • Wie ist ppv definiert?
  • void**, wie üblich in der QueryInterface () - Proben.
  • So gilt: C* c = static_cast< C* >(das); garantieren einen Zeiger auf das richtige sub-Klasse? Oder muss ich dynamic_cast?
  • static_cast ist genug, wenn Sie Stimmen, um eine Basis-Klasse, der compiler hat genug Daten, um die notwendigen Anpassungen während der Kompilierung. Der compiler wird sich weigern zu tun, die static_cast einer abgeleiteten Klasse, aber ein dynamic_cast noch erfolgreich sein könnte.
InformationsquelleAutor sharptooth | 2009-11-16
Schreibe einen Kommentar