Warum wird der Standardkonstruktor in der virtuellen Vererbung aufgerufen?
Ich verstehe nicht, warum in dem folgenden code, wenn ich instantiieren eines Objekts vom Typ daughter
die Standard - grandmother()
Konstruktor aufgerufen wird ?
Dachte ich, dass entweder die grandmother(int)
Konstruktor aufgerufen werden soll (Folgen Sie der Spezifikation von meiner mother
Konstruktor der Klasse), oder dieser code sollte nicht kompiliert werden, weil der virtuelle Vererbung.
Hier compiler leise ruft grandmother
default-Konstruktor in meinem Rücken, während ich nie danach gefragt.
#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);
}
InformationsquelleAutor der Frage Simon Desfarges | 2012-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Einsatz der virtuellen Vererbung, der virtuellen Basisklasse s Konstruktor direkt aufgerufen wird, indem die abgeleitete Klasse den Konstruktor. In diesem Fall, die
daughter
Konstruktor direkt ruft diegrandmother
Konstruktor.Da Sie nicht explizit aufrufen
grandmother
Konstruktor in der Initialisierungsliste der Standardkonstruktor aufgerufen wird. Zum Aufruf der richtigen Konstruktor, es zu ändern:Siehe auch In diesem FAQ-Eintrag.
InformationsquelleAutor der Antwort interjay