Delegation in die Schwesterklasse

8

Ich ging durch das: - Ссылка

Kann mir jemand erklären, wie das passiert und warum passiert das?

    
Invictus 24.06.2013, 16:25
quelle

3 Antworten

8

Der Schlüssel, der in zwei der anderen Antworten fehlt, ist, dass eine virtuelle Vererbung vorhanden ist. Dies bedeutet, dass im vollständigen Objekt nur das Unterobjekt eins Base vorhanden ist, das von Der1 und Der2 geteilt wird.

Jeder der Typen Der1 und Der2 stellt die Implementierung einer der virtuellen Funktionen dieser Basis bereit, und da es nur ein solches Objekt gibt, stellt die Kombination Der1 und Der2 die Implementierung bereit von beiden Mitgliedern innerhalb des vollständigen Objekts.

Sie können die Geschwisterklasse aufrufen, da Sie wirklich eine Memberfunktion Ihres Base -Typs aufrufen, und diese Funktion ist in Ihrem Base -Unterobjekt implementiert (mittels Ihrer Geschwisterklasse). Beachten Sie, dass Der1 nicht Der2::bar aufruft, sondern Base::bar , das dann an den letzten Overrider gesendet wird, der sich in Der2 befindet. Das ist wirklich nicht anders als der Versand an den endgültigen Überfahrer in anderen Fällen:

%Vor%

Wenn nun die Vererbung nicht virtuell wäre, gäbe es zwei Base Unterobjekte im vollständigen Typ, von denen jeder eine (andere) reine virtuelle Funktion hätte und Sie nicht einmal in der Lage wären, ein Objekt des Objekts zu instanziieren am weitesten abgeleiteten Typ (sofern nicht die Definitionen für die virtuellen Funktionen zur Verfügung gestellt wurden)

    
quelle
1

Weil dies die virtuellen Funktionen sind und der Aufruf ein Aufruf der Funktion aus der VirtualFunction-Tabelle ist. 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, enthält dieser Typ Einträge für alle virtuellen Funktionen, die von Basisklassen geerbt wurden.

    
Ation 24.06.2013 16:30
quelle
1

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

    
user1764961 24.06.2013 16:36
quelle

Tags und Links