Elenco incorreto - é o elenco ou o uso que é um comportamento indefinido
Se eu faço uma conversão de um tipo Base para um tipo Derivado, mas o tipo Base não é uma instância do tipo derivado, mas só uso o resultado se for, recebo um comportamento indefinido?
Difícil de entender o que estou perguntando? dê uma olhada neste exemplo:
struct Animal { int GetType(){...} };
struct Dog : Animal { bool HasLoudBark(){...}};
struct Cat : Animal { bool HasEvilStare(){...} };
Animal * a = ...;
Dog* d = static_cast<Dog*>(a);
if(a->GetType() == DogType && d->HasLoudBark())
....
Nesse casoa
pode ou não ser umDog
. Nós sempre fazemos ostatic_cast
doa
paraDog * d
mas nunca usamosd
a menos que tenhamos certeza que é umDog
.
Assumindo quea
não é umDog
, esse comportamento indefinido está no ponto do elenco? Ou é definido como não usamos realmented
a menos que seja realmente umDog
?
Referências às partes relevantes da norma são apreciadas.
(Sim, eu sei que posso usar dynamic_cast e RTTI, e provavelmente esse código não é ótimo, mas estou mais interessado em saber se isso é válido)