Ответ 1
Интериализация выглядит следующим образом:
5 Инициализация должна выполняться в следующем порядке:
- Во-первых, и только для конструктора самого производного класса как описанных ниже, виртуальные базовые классы должны быть инициализированы в порядок, который они появляются на первом переходе слева направо на глубину направленный ациклический граф базовых классов, где "слева направо" является порядок появления имен базового класса в производном классе базовый спецификатор-лист.
- Затем прямые базовые классы должны быть инициализированы в порядке объявления поскольку они появляются в списке-спецификаторе-базе (независимо от порядка mem-инициализаторы).
- Затем нестатические члены данных должны быть инициализированы в порядке они были объявлены в определении класса (снова независимо от порядок mem-инициализаторов).
- Наконец, выполняется тело конструктора. [Обратите внимание заказ на декларацию уполномочен обеспечить, чтобы база и член подобъекты уничтожаются в обратном порядке инициализации. ]
Что в основном означает, что member1
всегда будет инициализироваться до member2
. Таким образом, конструктор B
будет работать первым.
Даже если вы назовете их в обратном порядке в конструкторе A
:
A() : member2(foo), member1(bar) {}
это не имеет значения. Теперь ссылка на неинициализированный объект не является UB сама по себе, но она может зависеть от конструктора B
. Вы должны переключить порядок объявления:
C member2;
B member1;