C++: Initialisierung der geerbten Feld
Ich habe eine Frage zu der Initialisierung der geerbten member im Konstruktor der abgeleiteten Klasse. Beispiel-code:
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, warum dies geschieht? m_int
sollte Mitglied sein B
und übergeordneten Klasse A
sollte bereits initialisiert, wenn die Initialisierung von m_int
im B
passiert (weil übergeordnete Konstruktoren ausgeführt, bevor die Initialisierung der geerbten Klasse). Wo ist ein Fehler in meiner Argumentation? Was ist wirklich passiert in diesem code?
EDIT
: Ich bin mir bewusst, andere Möglichkeiten zu initialisieren dieses Mitglied (Basis-Konstruktor oder die Abtretung im abgeleiteten Konstruktor), aber ich möchte verstehen, warum ist es illegal in der Art, wie ich es versuchen? Einige spezielle C++ - Sprache-Funktion oder so? Bitte zeigen Sie mir ein Absatz im C++ - standard, wenn möglich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie einen Konstruktor für Eine (es ist geschützt, so dass nur B das so nennen kann), die initialisiert m_int so wie Sie ist, dann rufen Sie
:A(0)
wo Sie:m_int(0)
Könnte man auch einfach einstellen
m_int = 0
im Körper von B-Konstruktor. Es ist zugänglich (wie Sie beschreiben) es ist einfach nicht verfügbar in der speziellen Konstruktor-syntax.m_int
bereits vorhanden ist, wenn ich versuche Sie zu initialisieren. Also das sollte nicht das Problem sein...m_int = 0
) und das ist es in etwa an diesem Punkt.Konstruieren eine Instanz der Klasse
B
Sie zuerst instanziieren eine Instanz der KlasseA
. Während dieser Instanziierungm_int
wird initialisiert. Es ist nach, dass die Initialisierung, dieb
's Konstruktor aufgerufen wird, so können Sie nicht erneut initialisierenm_int
. Wenn das Ihr Ziel, dann können Sie einen Konstruktor implementieren, der fürA
braucht man ein int und dann rufen, dass inB
's Initialisierungs-Liste:Was Sie wollen, ist dies:
so, dass
m_int
initialisiert wird an der richtigen Stelle.Edit:
Aus einem Kommentar oben, der Grund, der compiler beschwert sich, wenn Sie versuchen zu initialisieren, die
m_int
variable inB
ist, dass es bereits initialisiert der Konstruktor vonA
. Das heißt, Sie können nicht re-initialisieren etwas, nur neu zuweisen. So können Sie zuweisen, wie Ben Jackson, die oben angeführt oder können Sie eine Initialisierung in der richtigen Stelle.machen einen Konstruktor in Einer
und verwenden Sie B(): A(2) {}
insteed von B():m_int(0){}
Ihre arbeiten.