Невозможно динамическое приведение при использовании dynamic_pointer_cast

Почему этот код не работает?

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

Как бы я это сделал?

5

Решение

Компилятор говорит вам, что происходит в конце сообщения:

(тип источника не полиморфный)

Ваш Event базовый класс должен иметь хотя бы один virtual функция-член (т.е. быть полиморфный тип), чтобы разрешить динамическое приведение. Вы могли бы сделать деструктором Event виртуальная:

class Event
{
public:
virtual ~Event() { /* whatever goes here, or nothing... */ }
// ...
};

Вот живой пример с полиморфными типами, показывая, что код компилируется (удаление виртуального деструктора может привести к ошибке компиляции похож на тот, который вы видите).

Как правильно сказано Люк Дантон в комментариях по умолчанию может быть определена версия виртуального деструктора по умолчанию (если ваш компилятор совместим с C ++ 11 в этом отношении):

class Event
{
public:
virtual ~Event() = default;
// ...
};
10

Другие решения

Чтобы выполнить dynamic_castтип, из которого вы разыгрываете, должен быть полиморфным. Чтобы это было правдой, он должен иметь или наследовать некоторые виртуальные члены. Удостовериться Event имеет функцию виртуального члена (по крайней мере, виртуальный деструктор).

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector