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