Verificando se um cross-cast poderia funcionar?

Sei que é legal usardynamic_cast para fazer uma "conversão cruzada" em uma hierarquia de classes. Por exemplo, se eu tiver classes parecidas com esta:

  A   B
   \ /
    C

Se eu tiver umA* ponteiro que está apontando para um objeto do tipoC, então eu posso usar

A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);

para obter um ponteiro para oB objeto base doC Estou apontando para

A razão pela qual mencionei isso é que, no momento em que escrevo o código acima, é possível que o compilador ainda não tenha visto a definição deC mesmo que seja vistoA eB. Isso significa que é possível que o compilador não detecte nenhum tipo de conexão entreA eB, mas ele ainda precisa compilar o código, pois é possível para uma classe comoC existir e para odynamic_cast ter sucesso em algumas circunstância

O problema é que isso significa que posso acidentalmente fazer a conversão cruzada para um objeto do tipo errado. Suponha que eu tenha classes parecidas com esta:

A   B    D
 \ /   
  C

Aqui,D é uma classe aleatória não relacionada. Se eu tentar escrever algo assim:

A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);

Então issodynamic_cast sempre falhará em tempo de execução, pois não há maneira possível de conectarA eD. Se eu estiver usandoD acidentalmente porque eu pretendia usarB, o compilador não me dará nenhuma indicação de que eu tenho um elenco sem sentid

Minha pergunta é:xiste alguma maneira de conseguir que o compilador me avise que o elenco sempre falhará em tempo de execuçã Ficaria feliz com uma solução no nível do idioma ou com alguma configuração do compilador para qualquer compilador importante que pudesse detectar isso. Se houver uma ferramenta externa, tudo bem também; Eu só quero saber se é possível pegar essa classe de erros.

questionAnswers(3)

yourAnswerToTheQuestion