Sé que es legal usar dynamic_cast
para hacer un "cross-cast" en una jerarquía de clases. Por ejemplo, si tengo clases que tener este aspecto:Verificando si podría funcionar un cruce cruzado?
A B
\/
C
Si tengo un puntero A*
que está apuntando a un objeto de tipo C
, entonces puedo usar
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
para obtener un puntero a el objeto base B
del C
al que estoy apuntando.
La razón que mencionar es que en el momento en que escribo el código anterior, es posible que el compilador aún no ha visto la definición de C
a pesar de que ha visto A
y B
. Esto significa que es posible que el compilador no detecte ningún tipo de conexión entre A
y B
, pero aún tiene que compilar el código porque es posible que exista una clase como C
y que el dynamic_cast
tenga éxito bajo alguna circunstancia.
El problema es que esto significa que puedo castear de forma accidental un objeto del tipo incorrecto. Supongamos que tengo clases que se ven así:
A B D
\/
C
Aquí, D
es alguna clase no relacionada al azar. Si trato de escribir algo como esto:
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
Entonces este dynamic_cast
siempre se producirá un error en tiempo de ejecución, ya que no hay manera posible conectar A
y D
. Si estoy usando D
accidentalmente porque quería usar B
, el compilador no me dará ninguna indicación de que tengo un reparto sin sentido.
Mi pregunta es: ¿Hay alguna forma en que pueda hacer que el compilador me advierta que el elenco siempre fallará en el tiempo de ejecución? Estaría contento con una solución de nivel de idioma o alguna configuración de compilador para cualquier compilador importante que pudiera detectar esto. Si hay una herramienta externa, está bien también; Solo quiero saber si es posible detectar esta clase de errores.
Esto debería ser seguro para el nivel del enlazador? En tiempo de compilación, ¿no sabe que una clase podría no crearse que se deriva de 'A' y' D'? – Keith
@ Keith- Definitivamente, a menos que tenga un compilador omnisciente. Hombre, quiero uno de esos ... :-) – templatetypedef
@Keith: Incluso el vinculador puede no tener información completa sobre todos los tipos, como se explica en mi respuesta. –