Каким образом порядок наследования в C++ влияет на конструктор?
Если я определяю структуру, которая наследуется от нескольких других структур, как порядок, в котором я перечисляю их, влияет на что-то вроде этого:
struct D: C,B{
D(): B(), C(){...}
};
Простой вопрос, но заранее спасибо!
1 ответ
Порядок построения зависит от последовательности наследования. Порядок инициализации не имеет значения. GCC фактически выдает предупреждение в этом случае.
В конструкторе 'D:: D ()':
main.cpp: 16: 17: предупреждение: база 'B' будет инициализирована после [-Wreorder]
D(): B(), C(){ ^
main.cpp: 16: 17: предупреждение: база 'C' [-Wororder]
main.cpp: 16: 5: предупреждение: при инициализации здесь [-Wreorder]
D(): B(), C(){
Это также четко указано в стандарте. Из раздела 12.6.2 Инициализация баз и членов
Инициализация происходит в следующем порядке:
- Во-первых, и только для конструктора самого производного класса, как описано ниже, виртуальные базовые классы должны быть инициализированы в том порядке, в котором они отображаются при обходе слева направо по глубине направленного ациклического графа базовых классов, где " слева направо "- это порядок появления имен базовых классов в списке базовых спецификаторов производного класса.
- Затем прямые базовые классы должны быть инициализированы в порядке объявления, как они появляются в списке базовых спецификаторов (независимо от порядка mem-initializer).