Если вы добавите отсутствующее виртуальное здесь:
class B: virtual public A
Это решит проблему множественного наследования, и вы получите один экземпляр A на класс
Тогда вывод будет простым ABCD илив случае изменения порядка
class D: public C, public B
Вывод:
ACBD
Это соответствует стандарту, и это поведение не зависит от используемого компилятора
Однако, если вам нужно иметь виртуальный только для класса C.В любом случае виртуальный подрядчик будет вызываться первым, опять же в соответствии со стандартом:
ИСО / МЭК JTC1 SC22 WG21 N 3690
ВНе делегирующий конструктор, инициализация происходит в следующем порядке:
Первый и только для конструктора самого производного класса (1.8), виртуальные базовые классы являютсяинициализируется в том порядке, в котором они появляются при обходе слева направо по глубине направленного ациклического графа базовых классов, где «слева направо» - это порядок появления базовых классов в базовом спецификаторе производного класса-list.
Затем прямые базовые классы инициализируются в порядке объявления по мере их появления в списке базовых спецификаторов (независимо от порядка mem-initializer).
- Затем не статические члены данных инициализируются в том порядке, в котором они были объявлены в определении класса (опять же, независимо от порядка mem-инициализаторов).
- Наконец,составной оператор тела конструктора выполнен.