В моей программе у меня есть базовый класс (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
указывал на non- 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
в остальной части моей программы, чтобы узнать тип объекта, и он работал правильно.
Почему это происходит?
Заранее спасибо.
Как вы уже выяснили, причиной не было инициализация ship
. Более фундаментально, dynamic_cast<Derived>(baseptr)
требует, чтобы baseptr
указывал на baseptr
Base
объект или был nullptr
. Например, это не сработает, если указатель был инициализирован, но объект был удален.