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.