Duplicar posibles:
C++ equivalent of instanceofC++ dynamic_cast vs typeid para la comparación de clase
Me preguntaba cuál es la diferencia entre dynamic_cast y typeid es en lo que respecta a la comparación acaba de clase (aparte de dynamic_cast que permite el acceso a los métodos de la subclase y el tipo id solo es útil para la comparación de clases). Encontré un StackOverflow de dos años haciendo la misma pregunta: C++ equivalent of instanceof. Sin embargo, tiene dos años y no quería borrar una publicación anterior (y no estoy seguro de cuándo salió typeid), así que pensé en volver a hacer la misma pregunta con una pequeña diferencia.
Básicamente, tengo la clase A y la clase B, que son ambas subclases de la clase abstracta C. La clase C se toma como parámetro de un método y quiero determinar si la clase C es realmente clase A o clase B Ambos typeid y dynamic_cast funcionan correctamente, por lo que se trata más de una cuestión de mejores prácticas/rendimiento. Estoy adivinando:
A* test = dynamic_cast<A*> someClassCVar
if (test != 0) { //it is of class A }
O
if (typeid(someClassCVar) == typeid(A)) {
//it is of class A
}
EDIT: Lo siento, se olvidó de incluir este bit de información. La documentación de ActiveMQ CMS indica que debe usar dynamic_cast, pero creo que es solo porque supone que el usuario querrá acceder a los métodos específicos de la subclase. Para mí, parece que typeid habría un mejor rendimiento si sólo se necesita una comparación de clase: http://activemq.apache.org/cms/cms-api-overview.html
yo diría que el 'dynamic_cast' es preferible, pero no tengo fuentes para respaldar mi opinión. – Constantinius
'dynamic_cast someClassCVar' devolverá no-null si' someClassCVar' es un puntero a 'A' o alguno de los descendientes de' A'. 'typeid (someClassCVar) == typeid (A)' es verdadero solo si 'someClassCVar' es de tipo A. Entonces 2 pedazos de tu código no son equivalentes. – a1ex07
Normalmente, es un olor de diseño si un programa C++ necesita saber a qué clase secundaria apunta un puntero principal. Al menos debe dar un paso atrás durante 15 minutos y mirar su diseño. –