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, Например, это не будет работать, если указатель был инициализирован, но объект затем удален.

Другие вопросы по тегам