Ho una domanda sull'inizializzazione dei membri ereditati nel costruttore della classe derivata. Esempio di codice:C++: inizializzazione del campo ereditato
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Questo codice mi dà il seguente risultato:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(vedi http://codepad.org/tn1weFFP)
sto cercando di indovinare perché questo accade?deve essere membro di B
e la classe padre A
deve essere già inizializzata quando si verifica l'inizializzazione di m_int
in B
(perché i costruttori padre vengono eseguiti prima dell'inizializzazione del membro della classe ereditata). Dov'è un errore nel mio ragionamento? Cosa succede veramente in questo codice?
EDIT
: Sono a conoscenza di altre possibilità per inizializzare questo membro (costruttore di base o assegnazione nel costruttore derivato), ma voglio capire perché è illegale nel modo in cui lo provo? Alcune caratteristiche specifiche del linguaggio C++ o simili? Per favore indicami un paragrafo in C++, se possibile.
Questa è una buona risposta, ma vorrei solo aggiungere qualche spiegazione. Quando usi l'operatore:, stai dicendo al compilatore che prima di fare qualsiasi altra cosa dovrebbe eseguire queste istruzioni. Fondamentalmente stai impostando una variabile prima dell'esecuzione del costruttore genitore (o di qualsiasi altra cosa). Quindi la variabile non esiste. : A(), m_int (0) dovrebbe funzionare pure.Per impostazione predefinita, se non si utilizza:, il compilatore eseguirà il costruttore delle classi di base. In altre parole, se non fai nulla C++ farà cose predefinite per te, se inizi a specificare le cose, si presume che tu sappia cosa stai facendo. –
Hmmm ... Per quanto ne so, il costruttore della classe genitore è sempre eseguito prima di qualsiasi altra inizializzazione, e quindi la variabile 'm_int' esiste già quando sto provando a inizializzarla. Quindi questo non dovrebbe essere il problema ... – Haspemulator
@Haspemulator Sì, esiste già ma è per questo che stai ricevendo l'errore. È già stato inizializzato di default dal costruttore di A. Non è possibile inizializzare nuovamente una variabile nel costruttore di B. Puoi riassegnare come afferma Ben Jackson sopra ('m_int = 0') e questo è tutto a quel punto. – wheaties