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:
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)
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.
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.
Tags und Links c++ virtual-functions