Heim >Backend-Entwicklung >C++ >Warum wird der Standardkonstruktor der virtuellen Basisklasse in einer virtuellen Vererbungshierarchie aufgerufen?

Warum wird der Standardkonstruktor der virtuellen Basisklasse in einer virtuellen Vererbungshierarchie aufgerufen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-16 15:25:03731Durchsuche

Why is the default constructor of the virtual base class called in a virtual inheritance hierarchy?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn