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&nbsp;pode ou não ser umDog. Nós sempre fazemos ostatic_cast&nbsp;doa&nbsp;paraDog * d&nbsp;mas nunca usamosd&nbsp;a menos que tenhamos certeza que é umDog.

Assumindo quea&nbsp;não é umDog, esse comportamento indefinido está no ponto do elenco? Ou é definido como não usamos realmented&nbsp;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)