Dies ist der Code:Mixing virtuelle und nicht virtuelle Vererbung einer Basisklasse
struct Biology
{
Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : Biology
{
Human() { cout << "Human CTOR" << endl; }
};
struct Animal : virtual Biology
{
Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{
Centaur c;
return 0;
}
Dieser Code druckt:
Biology CTOR
Biology CTOR
Human CTOR
Animal CTOR
Centaur CTOR
Warum?
Da wir ein Centaur
Objekt zu erstellen, starten wir vom Aufbau der Centaur
von Human
Konstruktion, Animal
und schließlich Centaur
(wir gehen von dem weniger abgeleitet auf die meisten abgeleitet).
des von Human
Beginnen wir: Human
erbt von Biology
, also nennen wir Biology
‚s Konstruktor zuerst. Nun, da die Basisklasse Human
konstruiert ist, können wir endlich die Human
selbst konstruieren. Aber stattdessen wird Biology
wieder aufgebaut!
Warum? Was passiert hinter den Kulissen?
Bitte beachten Sie, dass es völlig beabsichtigt war Animal
verlassen zugleich praktisch von Biology
und vererben, ist es auch beabsichtigt war praktisch nicht von Biology
vererben Human
verlassen.
Wir lösen die Dreaded Diamant in einer falschen Art und Weise: Mensch und Tier praktisch Biologie erben sollte, um diese Arbeit zu machen.
Ich bin nur neugierig.
Auch hierzu finden Sie diesen Code:
struct Biology
{
Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : virtual Biology
{
Human() { cout << "Human CTOR" << endl; }
};
struct Animal : Biology
{
Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{
Centaur c;
return 0;
}
Hier haben wir Human
praktisch von Biology
vererben, während Animal
eingestellt ist in den "klassischen Weg" erben.
Aber diesmal ist der Ausgang anders:
Biology CTOR
Human CTOR
Biology CTOR
Animal CTOR
Centaur CTOR
Dies, weil Centaur
inherits zunächst von Human
und dann von Animal
.
Wäre die Reihenfolge umgekehrt, hätten wir im ersten Beispiel das gleiche Ergebnis wie zuvor erzielt - zwei Biology
Instanzen, die in einer Reihe aufgebaut sind.
Was ist die Logik davon?
Bitte versuchen Sie, Ihren Weg zu erklären, ich habe schon Tonnen von Websites überprüft, die darüber sprechen. Aber keiner scheint meine Bitte zu erfüllen.
Was für eine ausgezeichnete Frage! – Hexaholic