Im folgenden Code habe ich versucht, ein Leaf
Objekt obj
zu erstellen, um die Konstruktorreihenfolge in der mehrschichtigen Vererbung zu sehen, aber ich finde die Struktur von obj
und Konstruktoraufrufen in diesem Fall ein wenig seltsam.Wie wird die direkte Basis in virtueller Vererbung aufgebaut?
#include<iostream>
using namespace std;
class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl; }
};
class Level1 : public Base2, virtual public Base1
{
public:
Level1(void)
{
cout << "class Level1" << endl;
}
};
class Level2 : public Base2, virtual public Base1
{
public:
Level2(void)
{
cout << "class Level2" << endl;
}
};
class Leaf :virtual public Level2, virtual public Level1
{
public:
Leaf(void)
{
cout << "class Leaf" << endl;
}
};
int main(void)
{
Leaf obj;
return 0;
}
Mit dem Ausgang der Konstruktor zeigt ruft:
class Base1
class Base2
clase Level2
class Base2
class Level1
class Leaf
Aber die Struktur von obj am Ende des Programms ist es tatsächlich:
obj
--Level2
----Base2
----Base1
--Level1
----Base2
----Base1
--Base1
Ich weiß, die Base1
von obj
ist virtual vererbt, aber während der Konstruktion von obj
, Level2
und Level1
müssen auch gebaut werden, was zu Base1
in jeder ihrer Struktur führt. Aber der gesamte Konstruktionsprozess ruft nur einmal Base1
Konstruktor auf. Ich kann das nicht erklären. Bedeutet das, dass die Base1
in Level2
und Level1
innerhalb obj
teilt die gleichen Daten mit Base1
, die direkt zu obj
gehört?
Der springende Punkt der virtuellen Vererbung ist, dass Sie nur * ein * virtuelles Basisunterobjekt haben. –
Sie wissen, dass im Gegensatz zu C, in C++ die leere Parameterliste einfach '()', oder? – curiousguy