Рассмотрим следующий код:
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
Это запрещено стандартом ([n3290: 5.2.9/2]), поэтому код не компилируется, потому что Derived фактически наследуется от Base. Удаление virtual из наследования делает код действительным.
Какова техническая причина для этого правила?