Por que o static_cast não pode ser usado para diminuir a conversão quando a herança virtual está envolvida?
Considere o seguinte código:
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
Isso é proibido pela norma [n3290: 5.2.9/2]
) para que o código não seja compilado, porqueDerived
virtualment herda deBase
. Removendo ovirtual
da herança torna o código válido.
Qual é o motivo técnico para esta regra existir?