2013-06-24 6 views

Antwort

1

Da dies die virtuellen Funktionen sind und Aufruf ist Aufruf der Funktion von VirtualFunction-Tabelle. Es ist nur ein Nachschlagen in der Tabelle nach definiertem Index. Diese Tabelle ruft Daten ab, wenn ein Objekt erstellt wird, und da der dynamische Typ des Objekts Join ist und dieser Typ Einträge für alle virtuellen Funktionen enthält, die von Basisklassen geerbt wurden.

1

Kurze Antwort wäre:
Obwohl die Join-Klasse von Der1 und Der2 abgeleitet ist, wird es nur eine Instanz der Base-Klasse geben. Das liegt an der virtuellen Vererbung. Wenn die Basisklasse keine abstrakte Klasse wäre und Sie dem Konstruktor einige Argumente übergeben müssten, würden diese Aufrufe sowohl in Der1 als auch in Der2 weggelassen und Sie müssten diese Argumente über den Join übergeben.

8

Der Schlüssel, der in zwei der anderen Antworten fehlt, ist, dass eine virtuelle Vererbung vorhanden ist. Dies bedeutet, dass es im gesamten Objekt nur einBase Unterobjekt gibt, das von Der1 und Der2 geteilt wird.

Jeder der Der1 und Der2 Typen bietet die Implementierung einer der virtuellen Funktionen dieser Basis, und da nur ein solches Objekt, die Kombination von Der1 und Der2 bieten die Umsetzung von beiden Mitglieder innerhalb der ist komplettes Objekt.

Sie können in die Geschwisterklasse senden, da Sie wirklich eine Elementfunktion Ihres Typs Base aufrufen, und diese Funktion ist in Ihrem Unterobjekt Base implementiert (anhand Ihrer Geschwisterklasse). Beachten Sie, dass Der1 nicht Der2::bar, sondern Base::bar aufrufen, die dann an den endgültigen Overrider gesendet wird, der sich in Der2 befindet. Das ist wirklich nicht anders aus dem Versand der endgültigen Übergehungseinrichtung in anderen Fällen:

struct base { virtual void f() = 0; }; 
struct d : base { void g() { f(); } }; 
struct d1 : d { void f() { std::cout << "here"; }; 
int main() { 
    d1 x; 
    x.g(); // dispatches from 'd::g' to 'd1::f' which is below in the hierarchy! 
      // yeah, right, everyone knows that... no magic here 
} 

Nun, wenn Vererbung nicht virtuell, gäbe es zwei Base Subobjekte im gesamten Typ sein, von denen jeder eine haben würde (unterschiedliche) reine virtuelle Funktion, und Sie wären nicht einmal in der Lage, ein Objekt des am meisten abgeleiteten Typs zu instanziieren (sofern nicht die Definitionen für die virtuellen Funktionen zur Verfügung gestellt wurden)

Verwandte Themen