在我的程序中,我有一个基类(ship
)和四个派生类(pirate
,mercantile
,repairing
,exploring
)和一个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
})。
所以我尝试通过编写以下代码来查看boolean
中if
值的结果:
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
相同的方法来查找对象的类型并且它正常工作。
为什么会这样?
提前致谢。
答案 0 :(得分:0)
正如您已经想到的那样,原因并未初始化ship
。更重要的是,dynamic_cast<Derived>(baseptr)
要求baseptr
必须指向实时Base
对象或nullptr
。例如。如果指针被初始化,它将无法工作,但随后删除了对象。