Рассмотрим следующий код:
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
из наследования делает код действительным.
Какова техническая причина для этого правила?