Порядок построения хорошо определен в c ++. Построение начинается в списке инициализации complete (наиболее производный тип), из которого вызываются все остальные конструкторы. Сначала виртуальные базы, затем прямые базы в другом объявлении (они будут в том же порядке применять тот же порядок для создания своих собственных баз и членов) и, наконец, члены в порядке объявления в классе, а не в порядке, в котором кажется, что конструкторы вызываются в списке инициализации.
Нет способа повлиять на порядок, в котором происходит построение, и безопасно получить доступ к базовым элементам внутри конструкции производного типа. Что, вероятно, удивительно, так это обратный вызов виртуальной функции из базового конструктора. На каждом этапе процесса строительства тип объекта меняется. Таким образом, для объекта типа X с основами B_i, только после того, как все подобъекты B_i завершены, и непосредственно перед тем, как первый член X запускается, тип объекта становится X. Это означает, что вызов базового метода в базе класс будет отправлен в этот базовый класс, а не в конечный создаваемый тип.