Tengo una pregunta sobre la inicialización de miembros heredados en el constructor de la clase derivada. Código de ejemplo:C++: Inicialización del campo heredado
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Este código me da el siguiente resultado:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(ver http://codepad.org/tn1weFFP)
estoy adivinando por qué sucede esto? m_int
debe ser miembro de B
, y la clase primaria A
ya debe inicializarse cuando se produce la inicialización de m_int
en B
(porque los constructores principales se ejecutan antes de la inicialización del miembro de la clase heredada). ¿Dónde hay un error en mi razonamiento? ¿Qué sucede realmente en este código?
EDIT
: Soy consciente de otras posibilidades para inicializar este miembro (constructor base o asignación en el constructor derivado), pero quiero entender por qué es ilegal en la forma en que lo intento? ¿Algun característica específica del lenguaje C++ o tal? Por favor apúntame a un párrafo en C++ estándar si es posible.
Esta es una buena respuesta, pero me gustaría añadir algunas explicaciones. Cuando usa el operador: le dice al compilador que antes de hacer cualquier otra cosa debería ejecutar estas instrucciones. Básicamente está estableciendo una variable antes de que se haya ejecutado el constructor padre (o cualquier otra cosa). Por lo tanto, la variable no existe. : A(), m_int (0) debería funcionar también.De manera predeterminada, si no usa:, el compilador ejecutará el constructor de las clases base. En otras palabras, si no hace nada, C++ hará las cosas predeterminadas por usted, si comienza a especificar las cosas, asume que sabe lo que está haciendo. –
Hmmm ... Hasta donde yo sé, el constructor de la clase padre siempre se ejecuta antes que cualquier otra inicialización, por lo que la variable 'm_int' ya existe cuando intento inicializarla. Así que este no debería ser el problema ... – Haspemulator
@Haspemulator Sí, ya existe pero es por eso que está obteniendo el error. Ya ha sido inicializado por defecto por el constructor de A. No puede reinicializar una variable en el constructor de B. Puede reasignar como dice Ben Jackson arriba ('m_int = 0') y eso es todo en ese punto. – wheaties