C ++: Inicialização do campo herdado

Eu tenho uma pergunta sobre a boot de membros herdados no construtor de class derivada. Exemplo de código:

class A { public: int m_int; }; class B: public A { public: B():m_int(0){} }; 

Este código me dá a seguinte saída:

In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'

(veja http://codepad.org/tn1weFFP )

Eu estou supondo porque isso acontece? m_int deve ser membro de B , e a class pai A já deve ser inicializada quando a boot de m_int em B ocorrer (porque os construtores pai são executados antes da boot do membro da class herdada). Onde está um erro no meu raciocínio? O que realmente acontece nesse código?

EDIT : Estou ciente de outras possibilidades para inicializar este membro (base construtor ou atribuição no construtor derivado), mas eu quero entender por que é ilegal na maneira que eu tente isso? Algum recurso específico da linguagem C ++ ou algo semelhante? Por favor, aponte-me para um parágrafo no padrão C ++, se possível.

Você precisa fazer um construtor para A (ele pode ser protegido para que somente B possa chamá-lo) que inicializa m_int exatamente como você tem, então você invoca :A(0) onde você tem :m_int(0)

Você também pode definir m_int = 0 no corpo do construtor de B. É acessível (como você descreve) simplesmente não está disponível na syntax especial do construtor.

Para construir uma instância da class B você primeiro instancia uma instância da class A Durante essa instanciação, m_int é inicializado. É após essa iniciação que o construtor b é chamado, então você não pode reinicializar m_int . Se esse é o seu objective, então você pode implementar um construtor para A que recebe um int e então chama isso na lista de boot de B :

 class A { public: A(int x): m_int(x) {} int m_int; }; class B: public A { public: B(): A(2) {} }; 

O que você quer é isto:

 class A{ public: A() : m_int(0); int m_int; }; 

para que m_int seja inicializado no lugar correto.

Editar:

De um comentário acima, a razão pela qual o compilador reclama quando você tenta inicializar a variável m_int em B é que ela já foi inicializada pelo construtor de A Ou seja, você não pode reinicializar algo, apenas reatribuir. Então, você pode reatribuir como Ben Jackson afirmou acima ou você pode inicializar no lugar certo.

faça um construtor em A e use B (): A (2) {} insteed de B (): m_int (0) {} seu funcionamento.