Конструкторы в иерархии вызываются вверх:
- base class member objects
- base class constructor body
- derived class member objects
- derived class constructor body
Вывод правильный.
Давайте упростим ваш код:
struct BaseMember
{
BaseMember() { cout << "base member" <<endl; }
};
struct Base
{
BaseMember b;
Base() { cout << "base" << endl; }
};
struct DerivedMember
{
DerivedMember() { cout << "derived member" << endl; }
};
struct Derived : public Base
{
DerivedMember d;
Derived() { cout << "derived" << endl; }
};
Derived d;
Когда создается d
, сначала создается деталь Base
. Прежде чем он входит в тело конструктора, все объекты-члены инициализируются. Итак, BaseMember
- первый инициализированный объект.
Далее вводится конструктор Base
.
До того, как входит конструктор Derived
, объекты-члены Derived
инициализируются, поэтому создается DerivedMember
, вызывается следующий конструктор Derived
.
Это происходит потому, что при вводе тела конструктора производного класса базовые классы и объекты-члены должны быть полностью инициализированы.
EDIT Как указал Матье, порядок, в котором объекты-члены инициализируются, определяется порядком их появления в определении класса, а не порядком, в котором они появляются в списке инициализатора.