Почему этот код не работает?
std::shared_ptr<Event> e = ep->pop();
std::shared_ptr<TrackerEvent> t;
t = std::dynamic_pointer_cast<TrackerEvent>(e);
Я получаю следующую ошибку:
/usr/include/c++/4.6/bits/shared_ptr.h:386: error: cannot dynamic_cast '(& __r)->std::shared_ptr<Event>::<anonymous>.std::__shared_ptr<_Tp, _Lp>::get [with _Tp = Event, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]()' (of type 'class Event*') to type 'class TrackerEvent*' (source type is not polymorphic)
TrackerEvent
наследуется от Event
так что я думаю, проблема в том, что я не могу сыграть в этом направлении. Но ep->pop()
может либо вернуть объект типа Event
или же TrackerEvent
, И я надеялся, что когда я попытаюсь TrackerEvent
и он возвращается NULL
Я бы знал, есть ли у меня Event
или же TrackerEvent
…
Как бы я это сделал?
Компилятор говорит вам, что происходит в конце сообщения:
(тип источника не полиморфный)
Ваш Event
базовый класс должен иметь хотя бы один virtual
функция-член (т.е. быть полиморфный тип), чтобы разрешить динамическое приведение. Вы могли бы сделать деструктором Event
виртуальная:
class Event
{
public:
virtual ~Event() { /* whatever goes here, or nothing... */ }
// ...
};
Вот живой пример с полиморфными типами, показывая, что код компилируется (удаление виртуального деструктора может привести к ошибке компиляции похож на тот, который вы видите).
Как правильно сказано Люк Дантон в комментариях по умолчанию может быть определена версия виртуального деструктора по умолчанию (если ваш компилятор совместим с C ++ 11 в этом отношении):
class Event
{
public:
virtual ~Event() = default;
// ...
};
Чтобы выполнить dynamic_cast
тип, из которого вы разыгрываете, должен быть полиморфным. Чтобы это было правдой, он должен иметь или наследовать некоторые виртуальные члены. Удостовериться Event
имеет функцию виртуального члена (по крайней мере, виртуальный деструктор).