Dynamic_cast debería hacer el truco
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
La dynamic_cast
palabra clave arroja un dato desde un puntero o tipo de referencia a otro, realizando una verificación de tiempo de ejecución para garantizar la validez del reparto.
Si intenta lanzar un puntero a un tipo que no es un tipo de objeto real, el resultado del lanzamiento será NULL. Si intentas lanzar para hacer referencia a un tipo que no es un tipo de objeto real, el lanzamiento arrojará una bad_cast
excepción.
Asegúrese de que haya al menos una función virtual en la clase Base para hacer que dynamic_cast funcione.
Tema de Wikipedia Información de tipo de tiempo de ejecución
RTTI está disponible solo para clases que son polimórficas, lo que significa que tienen al menos un método virtual. En la práctica, esto no es una limitación porque las clases base deben tener un destructor virtual para permitir que los objetos de las clases derivadas realicen una limpieza adecuada si se eliminan de un puntero base.
dynamic_cast
tira si no es convertible? ¿Hay alguna manera de hacerlo sin generar un lanzamiento?A* aptr = dynamic_cast<A*>(ptr);
// ¿no se supone que es asíuint8_t*
? Es decir, ¿puedo comprobar esouint32_t* x = dynamic_cast<uint32_t*>(p)
, dóndep
estáuint8_t*
? (Estoy tratando de encontrar una prueba para infringir las infracciones).El reparto dinámico es el mejor para su descripción del problema, pero solo quiero agregar que puede encontrar el tipo de clase con:
fuente
11MyClass
. Para deshacer, puede usar la biblioteca de extensiones ABI encxxabi.h
. Esto teabi::__cxa_demangle
da el nombre realEsto se llama RTTI , pero seguramente querrá reconsiderar su diseño aquí, porque encontrar el tipo y hacer cosas especiales basadas en él hace que su código sea más frágil.
fuente
Solo para completar, construiré una compilación de Robocide y señalaré que
typeid
se puede usar solo sin usar name ():Salida:
fuente
Probablemente incruste en sus objetos una "etiqueta" ID y úsela para distinguir entre objetos de clase A y objetos de clase B.
Sin embargo, esto muestra una falla en el diseño. Idealmente, aquellos métodos en B que A no tiene, deberían ser parte de A pero quedar vacíos, y B los sobrescribe. Esto elimina el código específico de la clase y está más en el espíritu de OOP.
fuente
Estás buscando
dynamic_cast<B*>(pointer)
fuente
Porque tu clase no es polimórfica. Tratar:
Ahora
BaseClas
es polimórfico. Cambié la clase a struct porque los miembros de una estructura son públicos por defecto.fuente
Tu descripción es un poco confusa.
En términos generales, aunque algunas implementaciones de C ++ tienen mecanismos para ello, no se debe preguntar sobre el tipo. En su lugar, se supone que debe hacer un dynamic_cast en el puntero a A. Lo que esto hará es que, en tiempo de ejecución, se verificará el contenido real del puntero a A. Si tiene una B, obtendrá su puntero a B. De lo contrario, obtendrá una excepción o nulo.
fuente
Como otros indicaron, puedes usar dynamic_cast. Pero, en general, usar dynamic_cast para descubrir el tipo de la clase derivada en la que está trabajando indica un mal diseño. Si está anulando una función que toma el puntero de A como parámetro, entonces debería poder trabajar con los métodos / datos de la clase A y no debería depender de los datos de la clase B. En su caso, en lugar de anular si está seguro de que el método que está escribiendo funcionará solo con la clase B, entonces debe escribir un nuevo método en la clase B.
fuente
Usar funciones sobrecargadas. No requiere Dynamic_cast o incluso soporte RTTI:
fuente
Si puede acceder a la biblioteca de impulso, tal vez lo que necesita sea la función type_id_with_cvr () , que puede proporcionar el tipo de datos sin eliminar los modificadores constantes, volátiles, y && . Aquí hay un ejemplo simple en C ++ 11:
Espero que esto sea útil.
fuente