У меня вопрос об инициализации наследуемых членов в конструкторе производного класса. Пример кода:C++: Инициализация унаследованного поля
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
, а родительский класс A
должен быть инициализирован, когда инициализация m_int
в B
происходит (поскольку родительские конструкторы выполняются до инициализации члена наследуемого класса). Где ошибка в моих рассуждениях? Что на самом деле происходит в этом коде?
EDIT
: Я знаю о других возможностях инициализации этого элемента (базовый конструктор или назначение в производном конструкторе), но я хочу понять, почему это незаконно в том, как я это пробовал? Некоторые особенности языка C++ или такие? Пожалуйста, укажите, пожалуйста, параграф в стандарте C++.
Это хороший ответ, но я просто хотел бы добавить некоторое объяснение. Когда вы используете оператор:, вы сообщаете компилятору, что перед тем, как он сделает что-нибудь еще, он должен запустить эти инструкции. В основном вы устанавливаете переменную перед тем, как запускается родительский конструктор (или что-то еще). Поэтому переменная не существует. : A(), m_int (0) также должны работать.По умолчанию, если вы не используете:, компилятор будет запускать конструктор базовых классов. Другими словами, если вы ничего не сделаете, C++ будет делать вещи по умолчанию для вас, если вы начнете задавать вещи, предполагается, что вы знаете, что делаете. –
Хммм ... Насколько я знаю, конструктор родительского класса всегда запускается перед любыми другими инициализациями, поэтому переменная 'm_int' уже существует, когда я пытаюсь ее инициализировать. Так что это не должно быть проблемой ... – Haspemulator
@Haspemulator Да, он уже существует, но именно поэтому вы получаете ошибку. Он уже инициализируется по умолчанию конструктором A. Вы не можете повторно инициализировать переменную в конструкторе B. Вы можете переназначить, как заявляет Бен Джексон выше ('m_int = 0'), и об этом в этот момент. – wheaties