2010-08-31 16 views
9

quiero jugar esta:fundido const Clase usando dynamic_cast

class Base 
{ 
public: 
    virtual ~Base(){}; 
}; 
class Der : public Base {}; 

int main() 
{ 
    const Base* base = new Der; 
    Der* der = dynamic_cast<Der*>(base); // Error 

    return 0; 
} 

¿Qué debo hacer? Traté de poner: const Der* der = dynamic_cast<Der*>(base); para mantener la const pero esto no funciona.

Respuesta

17

Prueba esto:

const Der* der = dynamic_cast<const Der*>(base); 

dynamic_cast no tiene la capacidad de eliminar un calificador const. Puede descartar const por separado con un const_cast, pero generalmente es una mala idea en la mayoría de las situaciones. Para el caso, si te ves usando dynamic_cast, generalmente es una señal de que hay una mejor manera de hacer lo que estás tratando de hacer. No siempre es malo, pero piensa en ello como una señal de advertencia de que estás haciendo las cosas de la manera difícil.

+0

Lo probé no funciona. – okami

+0

Necesita la const dos veces: una vez en el tipo de la variable asignada a, y una vez en el 'dynamic_cast'. En el ejemplo de lo que probaste, solo tuviste el primero. – Eclipse

+0

bien. Pero solo una pregunta bajo mi pregunta. ¿Por qué debería mantener virtual ~ Base() {}; a dynamic_cast no me da un error? – okami

2
const Der* der1 = dynamic_cast<const Der*>(base); 

Der* der2 = dynamic_cast<Der*>(const_cast<Base*>(base)); 

Mientras que las dos piezas fundidas anteriores funcionan, la segunda debe evitarse.

+0

Editado para agregar etiquetas de código. – Puppy