Он не скомпилируется по трем причинам, ни одна из которых не имеет никакого отношения к виртуальному наследованию (ну, может быть, последняя)
Вы забыли точки с запятой после определений классов
Ваше наследство является частным
D::foo()
является неоднозначным, если явно не переопределено
Кстати, само определение D неверно сформировано, а не только тот факт, что вы пытаетесь его использовать. Я имею в виду, если бы ваша функция main()
была пуста, она все равно не скомпилировалась бы.
И "Это скомпилируется?" имеет очевидный ответ «Почему бы тебе не попробовать?»
Цитата из стандарта: 10.3.10
В следующем примере показана функция, которая не имеет уникального
окончательное переопределение:
struct A {
virtual void f();
};
struct VB1 : virtual A { // note virtual derivation
void f();
};
struct VB2 : virtual A {
void f();
};
struct Error : VB1, VB2 { // ill-formed
};