Frage zu Konstruktoren bei virtuellen Basisklassen
-
class Basis { private: Wert; public: Basis(int Wert) { Basis::Wert = Wert; }; }; class Abgeleitet1 : virtual public Basis { public: Abgeleitet1(int Wert):Basis(Wert) {}; }; class Abgeleitet2 : public Abgeleitet1 { public: Abgeleitet2(int Wert):Abgeleitet1(Wert),Basis(Wert) {}; }; //----------------------------------------------------------------- class Abgeleitet3 : public Abgeleitet1,Abgeleitet2 { public: Abgeleitet3(int Wert):Abgeleitet1(Wert),Abgeleitet2(Wert),Basis(Wert) {}; };Meine Frage ist: Warum muss ich beim Konstruktor der Klasse Abgeleitet2 auch dem Konstruktor von Basis Parameter übergeben? Bei Abgeleitet3 ist mir das klar, da es dort Wert nur 1x geben soll und der Konstruktor von Basis somit nur 1x aufgerufen wird.
Aber Warum ist das bei Abgeleitet 2 nötig, dort besteht doch gar nicht die Möglichkeit,dass es Wert 2x gibt und der Konstruktor von Basis würde eh nur 1x aufgerufen werden (von Abgeleitet1).Danke
-
Hallo!
Die am meisten abgeleitete Klasse initialisiert die virtuelle Basisklasse.
D.h. falls du ein Objekt der Klasse Abgeleitet2 erstellen willst ist Abgeleitet2 die am meisten abgeleitete Klasse und somit für die initialisierung von Basis verantwortlich. Der (explizite) Aufruf des Basis-Konstruktors innerhalb des Abgeleitet1-Konstruktors wird nicht ausgeführt.
Dasselbe gilt für Abgeleitet3-Objekte. Hier würden die Aufrufe des Basis-Konstruktors aus Abgeleitet1 und Abgeleitet2 auch nicht ausgeführt, sondern nur der Aufruf aus Abgeleitet3.
Gruß
P.S.: Hat dein Design einen bestimmten Grund? Sieht irgendwie "seltsam" aus.

-
vic1986 schrieb:
P.S.: Hat dein Design einen bestimmten Grund? Sieht irgendwie "seltsam" aus.

Das hat so ziemlich jedes Design mit virtuellen Basisklassen so an sich. Die tauchen halt meist nur dann auf wenn irgendwas "seltsames" modelliert wird...