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