www variable implicito castear cast c++ casting

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.