2017-08-10 4 views
3

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

+1

Wo ist der gemeinsame Speicher? –

+2

Es ist eine interessante Frage, aber ich hoffe zu Gott, dass Sie diesen Code nie in einer tatsächlichen Anwendung verwenden. – Tim510

Antwort

5

Der Konstruktor für eine praktisch vererbten Klasse immer durch die meisten abgeleiteten Klasse aufgerufen wird. In deinem Fall ist es foo3. Der Konstruktoraufruf von foo1 in foo2 wird übersprungen.