В этот момент конструкторы базовых классов вызываются в конструкторе

Мне нужно знать, когда конструкторы базовых классов вызываются при вызове конструктора производного класса.

Small example:

class Base1
{...}

class Base2
{...}

class Derived : Base1,Base2
{...}

int main (int argc, char** argv)
{
Derived Child;
}

С помощью команды Derived Child; вызывается конструктор Derived, но я читал, что перед выполнением конструктора класса Derived выполняются все базовые конструкторы, то есть конструкторы Base1 и Base2.

Поэтому мне интересно, как бы был порядок событий, если бы конструктор класса Derived выглядел так

Derived::Derived (Parameters)
:                      //initialization list
Base2 (Parameters)
{...}

Вызывается ли конструктор класса Base2 в списке инициализации конструктора Derived или он вызывается раньше. Кроме того, все конструкторы базового класса вызываются в начале вызова конструктора Derived или при запуске списка инициализации конструктора класса Derived.

привет


person Streight    schedule 26.11.2013    source источник
comment
кстати, это базовый класс, а не базовый класс   -  person benjymous    schedule 26.11.2013


Ответы (1)


Порядок вызова конструкторов - это 1-й базовый класс, затем производный класс.

В текущем примере Порядок вызова конструкторов следующий: Basis1 Basis2 Derived

Если мы изменим определение класса на

класс Derived: Basis2, Basis1

то порядок вызовов конструкторов будет следующим: Basis2 Basis1 Derived

Конструктор базового класса всегда вызывается перед производным классом, независимо от того, вызывается он явно из списка инициализации или нет.

person Nik    schedule 26.11.2013
comment
Итак, инициализация базового конструктора используется мгновенно для вызова базового конструктора? Считывает ли компилятор сначала список инициализации перед вызовом базовых конструкторов? - person Streight; 26.11.2013
comment
Последние вопросы: 1. Я изменил ваш код на file-upload.net /download-8335688/main.cpp.html Почему я получаю результат x :2? 2.Будут ли вызываться базовые конструкторы несколько раз, когда они также инициализируются в списке инициализации? - person Streight; 26.11.2013
comment
Я получаю сообщение об ошибке при компиляции вашего файла: test.cpp: 24: 5: error: для базы «Basis1» задано несколько инициализаций. - person Nik; 26.11.2013
comment
Хорошо, теперь работает :). Вы должны изменить свой конструктор производного на Derived(int y):Basis2(),Basis1(6) .... Виноват :). В результате OF class Basis1 вызывается только вторым конструктором Basis1 (int x) списка инициализации. Следовательно, компилятор должен прочитать список инициализации перед запуском базовых конструкторов, я предполагаю, что это общий механизм: 1. Чтение списка инициализации 2. Инициализация базовых конструкторов, 3. Инициализация производного конструктора - person Streight; 26.11.2013