Ich habe eine Frage zur Initialisierung geerbter Member im Konstruktor der abgeleiteten Klasse. Beispielcode:C++: Initialisierung des geerbten Felds
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Dieser Code gibt mir die folgende Ausgabe:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(siehe http://codepad.org/tn1weFFP)
ich vermute ich, warum dies geschieht? m_int
sollte Mitglied von B
sein, und die übergeordnete Klasse A
sollte bereits initialisiert werden, wenn die Initialisierung von m_int
in B
geschieht (da Elternkonstruktoren vor der Memberinitialisierung der geerbten Klasse ausgeführt werden). Wo ist ein Fehler in meiner Argumentation? Was passiert wirklich in diesem Code?
EDIT
: Ich kenne andere Möglichkeiten, dieses Mitglied (Basiskonstruktor oder Zuordnung in abgeleiteten Konstruktor) zu initialisieren, aber ich möchte verstehen, warum ist es illegal in der Art, wie ich es versuche? Einige spezielle C++ - Sprachfunktionen oder solche? Bitte weisen Sie mich nach Möglichkeit auf einen Absatz im C++ - Standard hin.
Dies ist eine gute Antwort, aber ich möchte nur eine Erklärung hinzufügen. Wenn Sie den Operator: verwenden, sagen Sie dem Compiler, dass er diese Anweisungen ausführen soll, bevor er etwas anderes ausführt. Grundsätzlich setzen Sie eine Variable, bevor der übergeordnete Konstruktor (oder irgendetwas anderes) ausgeführt wurde. Daher existiert die Variable nicht. : A(), m_int (0) sollte auch funktionieren.Wenn Sie nicht: verwenden, führt der Compiler standardmäßig den Basisklassenkonstruktor aus. Mit anderen Worten, wenn Sie nichts tun, wird C++ Standard-Dinge für Sie tun, wenn Sie anfangen, Dinge zu spezifizieren, geht es davon aus, dass Sie wissen, was Sie tun. –
Hmmm ... Soweit ich weiß, wird der Konstruktor der Elternklasse immer vor allen anderen Initialisierungen ausgeführt, und daher existiert die Variable 'm_int' bereits, wenn ich versuche, sie zu initialisieren. Also sollte das nicht das Problem sein ... – Haspemulator
@Haspemulator Ja, es existiert bereits, aber deshalb erhalten Sie den Fehler. Es wurde bereits standardmäßig vom Konstruktor von A initialisiert. Sie können eine Variable in Bs Konstruktor nicht neu initialisieren. Sie können neu zuweisen, wie Ben Jackson oben sagt ('m_int = 0') und das ist ungefähr zu diesem Zeitpunkt. – wheaties