Ich habe eine Frage, die ich logisch nicht beantworten kann. Warum ist es, nachdem ich den folgenden Code ausführen:Vererbung Shared Memory
class foo1
{
private:
int age;
public:
foo1(int _age) :age(_age) {}
void print() { std::cout << age << std::endl; }
};
class foo2 :virtual public foo1
{
int grade;
public:
foo2(int _age, int _grade) :foo1(_age), grade(_grade) {}
};
class foo3 :virtual public foo2
{
private:
int score;
public:
foo3(int _age, int _grade, int _score) :
foo1(_age), foo2(5000, _grade), score(_score) {}
};
int main()
{
foo3 k(77,2,3);
k.print();
}
Die Konsolenausgabe ist 77, statt 5000. Mein Grund für die Annahme, dass 5000 das Recht ausgegeben werden würde (aber ich bin falsch) ist, dass, wenn wir mich der Initialisierer-Liste für den Konstruktor foo3 geschieht folgendes:
1) der Konstruktor foo1 das Alter bis 77 setzt
2) Danach wird der Konstruktor foo2 das Alter bis 5000 und setzt den Grad bis 2 , weil foo2 den Konstruktor von foo1 verwendet.
Warum nicht der Konstruktor von foo2 den vom Konstrukteur eingestellten Wert ändern foo1
Wo ist der gemeinsame Speicher? –
Es ist eine interessante Frage, aber ich hoffe zu Gott, dass Sie diesen Code nie in einer tatsächlichen Anwendung verwenden. – Tim510