2011-04-14 6 views
9

me gustaría algo de información sobre las mejores prácticas cuando se comparan los punteros en casos como este:C++: Comparación de los punteros de la base y clases derivadas

class Base { 
}; 

class Derived 
    : public Base { 
}; 

Derived* d = new Derived; 
Base* b = dynamic_cast<Base*>(d); 

// When comparing the two pointers should I cast them 
// to the same type or does it not even matter? 
bool theSame = b == d; 
// Or, bool theSame = dynamic_cast<Derived*>(b) == d? 

Respuesta

5

Si desea comparar las jerarquías de clases arbitrarias, la apuesta segura es que sean polimórficos y utilizar dynamic_cast

class Base { 
    virtual ~Base() { } 
}; 

class Derived 
    : public Base { 
}; 

Derived* d = new Derived; 
Base* b = dynamic_cast<Base*>(d); 

// When comparing the two pointers should I cast them 
// to the same type or does it not even matter? 
bool theSame = dynamic_cast<void*>(b) == dynamic_cast<void*>(d); 

Considere que a veces no se puede utilizar static_cast o conversión implícita de un derivado de una clase base:

struct A { }; 
struct B : A { }; 
struct C : A { }; 
struct D : B, C { }; 

A * a = ...; 
D * d = ...; 

/* static casting A to D would fail, because there are multiple A's for one D */ 
/* dynamic_cast<void*>(a) magically converts your a to the D pointer, no matter 
* what of the two A it points to. 
*/ 

Si A se hereda virtualmente, tampoco puede static_cast a D.

+1

Otra apuesta segura sería usar 'static_cast' para convertir ambos en una base común. Siempre que, por supuesto, sepa la base común. De lo contrario: si un puntero es un tipo base del otro, el compilador realizará la conversión automáticamente. –

5

No se requiere ninguna dominante en el caso anterior, una simple Base* b = d; funcionará. Entonces puede comparar los indicadores como los que está comparando ahora.

Cuestiones relacionadas