2011-08-30 35 views
15

De acuerdo con lo que leí, realizar un dynamic_cast en tiempo de ejecución incorrecto puede arrojar una excepción bad_cast o devolver cero.¿Cómo falla dynamic_cast?

¿Es correcto decir que devolverá cero si está lanzando punteros?

es decir:

class Base { virtual void a(){} }; 
class Derived: public Base {}; 

int main() { 
    Base *base = new Base(); 
    dynamic_cast<Derived*>(base); 
    return 0; 
} 

Y que va a lanzar una excepción bad_cast al lanzar objetos?

es decir:

class Base { virtual void a(){} }; 
class Derived: public Base {}; 

int main() { 
    Base base; 
    Base& ref = base; 
    dynamic_cast<Derived&>(ref); 
    return 0; 
} 

Respuesta

26

dynamic_cast devolverá NULL en un mal reparto si le están echando un puntero; lanzará std::bad_cast al emitir referencias. Es un error en tiempo de compilación intentar emitir objetos con dynamic_cast (por ejemplo, con dynamic_cast<Derived>(base))

+0

Ok, entonces la afirmación es correcta. Gracias. Edité el mensaje para hacer que la clase base sea polimórfica (agregando la función virtual) y usar la conversión de referencia para lanzar la excepción. – NIGO