Из стандартного [class.base.init]: "Если только в mem-initializer-id не указан нестатический член данных класса конструктора или прямая или виртуальная база этого класса, mem-initializer является некорректно сформированным. «
Очевидно, что gcc интерпретирует ваше дело как законное, поскольку Print
не является прямой, но виртуальной базой B
, однако MSVC 2008 не видит Print
как виртуальную базу B
- только виртуальную база не виртуальной базы. (Кстати, ваш пример компилируется на VS2005, так что это удивительное изменение в поведении.)
Я бы склонялся к интерпретации gcc
как к правильной (в противном случае было бы достаточно сформулировать «прямое основание»).
Чтобы обойти эту проблему, вы можете получить B
практически из Print
. Поскольку Print
уже является виртуальной базой A
, это никак не влияет на макет класса или количество субобъектов базового класса Print
.