Heim >Backend-Entwicklung >C++ >Warum wird der Standardkonstruktor der virtuellen Basisklasse in einer virtuellen Vererbungshierarchie aufgerufen?
Virtuelle Vererbung und Standardkonstruktoraufruf
In einer Vererbungshierarchie mit virtueller Vererbung kann der Standardkonstruktor der virtuellen Basisklasse unerwartet aufgerufen werden . Betrachten Sie den folgenden Code:
class grandmother { public: grandmother() { // Default constructor std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { // Parameterized constructor std::cout << "grandmother: " << attr << std::endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { std::cout << "mother: " << attr << std::endl; } }; class daughter: virtual public mother { public: daughter(int attr) : mother(attr) { std::cout << "daughter: " << attr << std::endl; } }; int main() { daughter x(0); }
Wenn eine Instanz der Tochterklasse erstellt wird, lautet die Ausgabe:
grandmother (default) mother: 0 daughter: 0
Trotz der Existenz eines parametrisierten Konstruktors in der Großmutterklasse ist die Der Standardkonstruktor wird aufgerufen. Warum passiert das?
Aufruf des Konstruktors der virtuellen Basisklasse
Bei der virtuellen Vererbung wird der Konstruktor der virtuellen Basisklasse direkt vom Konstruktor der am stärksten abgeleiteten Klasse aufgerufen. In diesem Fall ruft der Tochterkonstruktor direkt den Großmutterkonstruktor auf.
Da die Mutterklasse den Großmutterkonstruktor in ihrer Initialisierungsliste nicht explizit aufruft, wird der Standardkonstruktor verwendet. Um den gewünschten Konstruktor korrekt aufzurufen, sollte der Tochterkonstruktor wie folgt geändert werden:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
Durch den expliziten Aufruf des Konstruktors „grandmore(attr)“ in der Initialisierungsliste wird der richtige Konstruktor verwendet und die Ausgabe lautet:
grandmother: 0 mother: 0 daughter: 0
Das obige ist der detaillierte Inhalt vonWarum wird der Standardkonstruktor der virtuellen Basisklasse in einer virtuellen Vererbungshierarchie aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!