¿Por qué no se puede utilizar static_cast para hacer down-cast cuando se trata de una herencia virtual?
Considere el siguiente código:
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
Esto está prohibido por el estándar [n3290: 5.2.9/2]
) para que el código no se compile, porqueDerived
virtualment hereda deBase
. La eliminación de lavirtual
de la herencia hace que el código sea válido.
¿Cuál es la razón técnica para que exista esta regla?