variable - C++ dynamic_cast vs typeid para la comparación de clases
int casting c++ (2)
Posible duplicado:
C ++ equivalente de instanceof
Me preguntaba cuál es la diferencia entre dynamic_cast y typeid con respecto a la comparación de clase (aparte de dynamic_cast que permite el acceso a los métodos de la subclase y que el tipo de letra solo es útil para la comparación de clase). Encontré un StackOverflow de dos años que hacía la misma pregunta: C ++ equivalente de instanceof . Sin embargo, tiene dos años y no quería necrosar un post antiguo (y no estoy seguro de cuándo salió el tipo de letra ), así que pensé en volver a hacer la misma pregunta con una pequeña diferencia.
Básicamente, tengo clase A y clase B, que son subclases de la clase C abstracta. La Clase C se toma como un parámetro de un método y quiero determinar si la clase C es realmente la clase A o la clase B. dynamic_cast funciona correctamente, por lo que es más 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
}
EDITAR: Lo siento, se me olvidó incluir este bit de información. La documentación de ActiveMQ CMS indica que se debe usar dynamic_cast , pero creo que es solo porque asume que el usuario querrá acceder a métodos específicos de la subclase. Para mí, parece que typeid sería un mejor rendimiento si solo se necesita una comparación de clase: http://activemq.apache.org/cms/cms-api-overview.html
Hay una diferencia importante entre los dos métodos:
if(A* test = dynamic_cast<A*>(&someClassCVar)) {
// someClassCVar is A or publicly derived from A
}
Mientras:
if(typeid(someClassCVar) == typeid(A)) {
// someClassCVar is of class A, not a derived class
}
depende de si el procesamiento de identificación de tipo de publicación necesita un puntero en A o no.
cheking typeid seguramente será más rápido (ya que son identificadores constantes generados por el compilador), pero no proporcionará ninguna instancia A para manipular, por lo que lo obligará a realizar un dynamic_cast para obtener una instancia A.