2012-08-14 21 views
5

Duplicar posibles:
Finding the type of an object in C++Comprobación de si un puntero apunta a una clase C en particular ++

Tengo una pregunta con la comprobación de punteros para ver si se ajustan a una clase derivada en particular y tomar acción necesaria.

Digamos que actualmente tengo 2 clases derivadas DerivedClass1 y DerivedClass2 y la clase base BaseClass. Me gustaría verificar la siguiente acción.

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { acción1 } demás { acción2 }

¿Cómo puedo comprobar si hay puntos PTR a un DerivedClass en particular?

+2

No, muy probablemente * no * quiera saber cuál es el tipo dinámico de '* ptr'. –

Respuesta

10

Si BaseClass es polimórfico (contiene funciones virtuales), que puede probar:

if (dynamic_cast<DerivedClass1*>(ptr.get())) 

Pero por lo general se debe utilizar envío dinámico como relajarse indica, posiblemente, un patrón del visitante, para este tipo de cosas. Tirar tu código a la basura con dynamic_cast hace que sea difícil de mantener. Yo uso dynamic_cast casi NUNCA.

20

Si se va a pensar un poco más objeto orientedly, sólo haría un método virtual en la clase base:

Ptr<BaseClass> ptr; 

ptr->Action(); 

y tienen cada clase de ponerlo en práctica, según sea necesario. Me doy cuenta de que esta no es una respuesta real, pero es una forma alternativa de lograr su objetivo que a menudo se considera mejor, por lo que creo que vale la pena mencionarlo.

+0

gracias. este fue mi pensamiento inicial, pero tuve el problema de tener un método const en una clase particular y uno no const en otro, por lo tanto estaba tratando de agregar este comportamiento en un nuevo método. – lordlabakdas

4
if(dynamic_cast<DerivedClass1*>(ptr)) 
{ 
    // Points to DerivedClass1 
} 
else if(dynamic_cast<DerivedClass2*>(ptr) 
{ 
    // Pointes to DerivedClass2 
} 
+0

Si hubiera un tercer nivel, por ejemplo, 'DerivedClass1_1' y' DerivedClass1_2', la primera cláusula 'if' los trataría a ambos como 'DerivedClass1' - Eso podría o no ser lo que quiere el OP. –

+0

@ Component10 Simplemente respondí la pregunta del OP. No apruebo esta práctica y, por lo general, considero que esto solo es necesario cuando se han tomado malas decisiones de diseño. Gracias por señalar la situación de herencia, en caso de que el OP decida probar algo como esto. – Aesthete

Cuestiones relacionadas