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
Freigeben: 2024-11-16 15:25:03
Original
730 Leute haben es durchsucht

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);
}
Nach dem Login kopieren

Wenn eine Instanz der Tochterklasse erstellt wird, lautet die Ausgabe:

grandmother (default)
mother: 0
daughter: 0
Nach dem Login kopieren

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) { ... }
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage