Considérez le code suivant :
struct Base {};
struct Derived : public virtual Base {};
void f()
{
Base* b = new Derived;
Derived* d = static_cast<Derived*>(b);
}
Ceci est interdit par la norme ( [n3290: 5.2.9/2]
) donc le code ne se compile pas, car Derived
hérite virtuellement Base
. La suppression du virtual
de l'héritage rend le code valide.
Quelle est la raison technique de l'existence de cette règle ?