dynamic_cast使我的程序崩溃了

时间:2015-01-07 03:00:51

标签: c++ crash dynamic-cast

在我的程序中,我有一个基类(ship)和四个派生类(piratemercantilerepairingexploring)和一个repairing的成员函数我想知道ship *指向的对象是否为pirate类型,以便能够处理该情况。

因此,在该成员函数中,我有以下if

ship * shp;

shp = map[i][j]->getShip(); //random initialization of shp

if( (dynamic_cast<pirate *>(shp)) == NULL)  // <- program doesn't enter here  
{ . . . }                                   //      while it should

但是在运行时期间,我注意到即使if指向非shp对象(例如pirate,有时程序也没有输入exploring })。

所以我尝试通过编写以下代码来查看booleanif值的结果:

pirate *prt;
bool test;
if(map[i][j]->getShip()!=0){
    prt = dynamic_cast<pirate *>(shp);  //  <- program crashes here
    test = ( prt == NULL );
    cout<<test<<endl;
}

但是在编译并尝试运行它之后,程序在使用dynamic_cast时崩溃。

因此,dynamic_cast可能无法正常工作,这就是它未在前一代码中输入if的原因。

请注意,我在我的程序的其余部分使用了与dynamic_cast相同的方法来查找对象的类型并且它正常工作。

为什么会这样?

提前致谢。

1 个答案:

答案 0 :(得分:0)

正如您已经想到的那样,原因并未初始化ship。更重要的是,dynamic_cast<Derived>(baseptr)要求baseptr必须指向实时Base对象或nullptr。例如。如果指针被初始化,它将无法工作,但随后删除了对象。