Ich verstehe nicht, warum im folgenden Code, wenn ich ein Objekt vom Typ instanziiere daughter
, der Standardkonstruktor grandmother()
aufgerufen wird.
Ich dachte, dass entweder der grandmother(int)
Konstruktor aufgerufen werden sollte (um der Spezifikation meines mother
Klassenkonstruktors zu folgen ), oder dass dieser Code wegen der virtuellen Vererbung überhaupt nicht kompiliert werden sollte.
Hier ruft der Compiler stillschweigend den grandmother
Standardkonstruktor in meinem Rücken auf, während ich nie danach gefragt habe.
#include <iostream>
class grandmother {
public:
grandmother() {
std::cout << "grandmother (default)" << std::endl;
}
grandmother(int attr) {
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);
}
c++
inheritance
virtual-inheritance
Simon Desfarges
quelle
quelle
Antworten:
Bei Verwendung der virtuellen Vererbung wird der Konstruktor der virtuellen Basisklasse direkt vom Konstruktor der am meisten abgeleiteten Klasse aufgerufen. In diesem Fall
daughter
ruft dergrandmother
Konstruktor den Konstruktor direkt auf .Da Sie den
grandmother
Konstruktor in der Initialisierungsliste nicht explizit aufgerufen haben , wird der Standardkonstruktor aufgerufen. Um den richtigen Konstruktor aufzurufen, ändern Sie ihn in:daugther(int attr) : grandmother(attr), mother(attr) { ... }
Siehe auch Dieser FAQ-Eintrag .
quelle
mother
wird ignoriert, es sei denn, Sie instanziieren direktmother
und nicht eine abgeleitete Klasse.