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)

questionAnswers(2)

yourAnswerToTheQuestion