C ++: Инициализация наследуемого поля

У меня вопрос об инициализации наследуемых членов в конструкторе производного classа. Пример кода:

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

Этот код дает мне следующий результат:

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

(см. http://codepad.org/tn1weFFP )

Я предполагаю, почему это происходит? m_int должен быть членом B , а родительский class A уже должен быть инициализирован при инициализации m_int в B (поскольку родительские конструкторы выполняются до инициализации члена наследуемого classа). Где ошибка в моих рассуждениях? Что на самом деле происходит в этом коде?

EDIT : Я знаю о других возможностях инициализации этого элемента (базовый конструктор или назначение в производном конструкторе), но я хочу понять, почему это незаконно в том, как я его пробовал? Некоторые особенности языка C ++ или такие? Пожалуйста, укажите, пожалуйста, параграф в стандарте C ++.

    Вам нужно создать конструктор для A (он может быть защищен, чтобы только B мог его вызвать), который инициализирует m_int так же, как и у вас, затем вы вызываете :A(0) где у вас есть :m_int(0)

    Вы также можете просто установить m_int = 0 в тело конструктора B. Он доступен (как описано), он просто недоступен в синтаксисе специального конструктора.

    Чтобы построить экземпляр classа B вы сначала создаете экземпляр classа A Во время этого экземпляра m_int получает инициализацию. После этой инициализации вызывается конструктор b , поэтому вы не можете m_int инициализировать m_int . Если это ваша цель, вы можете реализовать конструктор для A который принимает int, а затем вызывает это в списке инициализации B :

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

    Что вы хотите, так это:

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

    так что m_int инициализируется в правильном месте.

    Редактировать:

    Из комментария выше, причина, по которой компилятор жалуется, когда вы пытаетесь инициализировать переменную m_int в B состоит в том, что она уже была инициализирована конструктором A То есть вы не можете повторно инициализировать что-то, только переназначить. Таким образом, вы можете переназначить, как сказал Бен jackson выше, или вы можете инициализировать в нужном месте.

    сделайте конструктор в A и используйте B (): A (2) {} insteed of B (): m_int (0) {} его работа.

    Давайте будем гением компьютера.