2016-11-17 3 views
1

Я боролся с концепцией конструкторов в контексте наследования. Эта путаница усугубляется тем фактом, что к этой теме были добавлены большие изменения с C + 11 (т. Е. Базовые конструкторы могут быть унаследованы?).Создает цепочку наследования цепочку вызовов конструктора?

Так что мой вопрос:

Предполагая, что я не использую наследование конструктора, а просто определить новый конструктор в моем производном классе, это базовый конструктор еще дозвонились? Похоже, этого не должно быть, но я столкнулся с некоторыми документами, в которых говорится, что это происходит. Кроме того, означает ли это, когда у вас есть цепочка наследования, будет вызвана серия конструкторов? Если да, то в каком порядке? База до производной или полученная до основания?

Спасибо!

+0

Если вы не вызываете 'super()', я считаю, что ответ _no_. –

+1

@ EricM. Ответ по-прежнему отсутствует с 'super()', потому что он не будет компилировать –

+0

LOL! Я знал, что это работает в java ... Я был 60%, возможно, 70% уверен, что он работал на C++. TIL. –

ответ

2

Вот порядок:

Вот что на самом деле происходит, когда полученный экземпляр:

  1. памяти для Derived отведен (достаточно для базового и производных частей)
  2. Соответствующий производный конструктор называется
  3. Базовый объект строится сначала с использованием соответствующего базового конструктора. Если базовый конструктор не задан, будет использоваться конструктор по умолчанию .
  4. Список инициализации инициализирует переменные
  5. Тело конструктора выполняет
  6. Управления возвращается вызывающими

Надеется, что это помогает.

+1

Не могли бы вы объяснить шаги 2 и 3. На шаге 2 говорится, что вызывается производный конструктор, а затем на шаге 3 он говорит: «базовый объект сначала строится с использованием соответствующего базового конструктора». Что называется первым? – Izzo

+0

Как я знаю, прежде чем производный конструктор может сделать что-либо существенное, сначала создается конструктор Base. Базовый конструктор устанавливает базовую часть объекта, управление возвращается конструктору Derived, а конструктору Derived разрешено завершить работу. – GAVD

+0

В чем разница между шагами 2 и 5? Что означает вызов конструктора, если он не выполняет его тело? – Barmar

Смежные вопросы