dynamic_cast дает сбой моей программе

0

В моей программе у меня есть базовый класс (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 в остальной части моей программы, чтобы узнать тип объекта, и он работал правильно.

Почему это происходит?

Заранее спасибо.

  • 0
    Возможности: stackoverflow.com/questions/278429/…
  • 0
    Если вы находитесь внутри первого оператора if, это означает, что приведение не удалось, и shp, вероятно, ищет какое-то недопустимое значение. Поэтому вторая попытка dynamic_cast shp (который, вероятно, находится в недопустимом состоянии) приведет к сбою. Вам нужно разместить больше кода для дальнейшего уточнения.
Показать ещё 5 комментариев
Теги:
crash
dynamic-cast

1 ответ

0

Как вы уже выяснили, причиной не было инициализация ship. Более фундаментально, dynamic_cast<Derived>(baseptr) требует, чтобы baseptr указывал на baseptr Base объект или был nullptr. Например, это не сработает, если указатель был инициализирован, но объект был удален.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню