2016-04-20 19 views
0

Ich versuche, einige Mitglieder der Basisklasse über seinen Konstruktor zu initialisieren, aber ich scheitere. Im folgenden Code scheint es, dass das abgeleitete Klassenelement message vor dem Aufruf des Basiskonstruktors nicht initialisiert wird. Ein Workaround wäre Child(string messg_arg) : message(messg_arg), Parent(messg_arg), aber gibt es eine Möglichkeit, dies zu vermeiden?Reihenfolge der Initialisierung in abgeleiteten Klassen

class Parent 
{ 
protected: 
    string something; 
    Parent(string something_arg) : something(something_arg) 
    {} 

} 

class Child : public Parent 
{ 
public: 
    string message; 
    Child(string messg_arg) : message(messg_arg), Parent(message) 
    {} 
} 
+0

Die Reihenfolge der Initialisierung wird durch die Reihenfolge bestimmt, in der die Mitglieder angezeigt werden, und Basisklassen erscheinen vor Mitgliedern. Mit diesem Weg, was willst du eigentlich erreichen? Die "Nachricht" in der "Kind" -Klasse schattiert die Nachricht in der "Eltern" -Klasse. – MicroVirus

+0

Ich habe versucht, ein Objekt in der abgeleiteten Klasse zu konstruieren und es durch Verweis auf die Basis übergeben. Jedenfalls werde ich das Design überdenken. – user4168715

+0

Anstatt die Basis an die Basis zu übergeben, muss die Basis eine Funktion definieren, die das Zeug von ihren Erben erhält und die Erben zwingt, sie zu implementieren, indem sie die Funktion rein virtuell macht. 'virtual Stuff & getStuff() = 0;' Es gibt ein paar mögliche Leistungsüberlegungen hier, aber die meiste Zeit ist dies eine einfache und sichere Möglichkeit, um zu bekommen, was Sie wollen. – user4581301

Antwort

0

Der Basisklassenkonstruktor wird vor allen Elementkonstruktoren in der abgeleiteten Klasse aufgerufen. Dies sollte in Ordnung sein:

Child(string messg_arg) : Parent(messg_arg), message(messg_arg) 
{} 
+0

Aber was, wenn ich ein Objekt in der abgeleiteten Klasse konstruieren und es dann durch Referenz auf die Basis übergeben will? – user4168715

+0

@ user4168715 Das ist nicht möglich, siehe Bearbeiten. Sie müssen es übergeben, nachdem die Basis initialisiert wurde. – emlai

+0

Klar genug, vielen Dank. – user4168715

Verwandte Themen