Каким образом порядок наследования в 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).

Другие вопросы по тегам