Порядок, который вы указываете в своем вопросе, не является "порядком вызова базового конструктора".На самом деле, вы не можете вызвать конструктор.Конструкторы не могут быть вызваны пользователем.Только компилятор может вызывать конструкторы.
Что вы можете сделать, это указать инициализаторы .В этом случае (список инициализатора конструктора) вы указываете инициализаторы для подобъектов более крупного объекта.Порядок, в котором вы указываете эти инициализаторы, не имеет значения: компилятор будет вызывать конструкторы в очень специфическом порядке, определенном спецификацией языка, независимо от порядка, в котором вы указываете инициализаторы.Сначала всегда вызываются конструкторы базового класса (в порядке, в котором базовые классы перечислены в определении класса), затем вызываются конструкторы подобъектов-членов (опять же, в порядке, в котором эти члены перечислены в определении класса).
(В этом правиле есть некоторые особенности, когда речь идет о виртуальных базовых классах, но я решил не включать их здесь.)
Что касается плохого поведения ... Конечно, естьпотенциал для "плохого поведения" здесь.Если вы предполагаете, что порядок инициализации зависит от порядка, который вы использовали в списке инициализатора конструктора, вы, скорее всего, в конечном итоге столкнетесь с неприятным сюрпризом, когда обнаружите, что компилятор полностью игнорирует этот порядок и использует свой собственный порядок (порядокдекларация) вместо.Например, автор этого кода
struct S {
int b, a;
S() : a(5), b(a) {}
};
может ожидать, что a
будет инициализирован первым, а b
получит начальное значение 5
от a
, но в действительности это выигралоне происходит, поскольку b
инициализируется до a
.