为什么这段代码不起作用?
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
...
我该怎么做?
答案 0 :(得分:10)
编译器告诉你消息末尾发生了什么:
(源类型不是多态的)
您的Event
基类需要至少有一个virtual
成员函数(即多态类型)才能允许动态强制转换。你可以使Event
虚拟的析构函数:
class Event
{
public:
virtual ~Event() { /* whatever goes here, or nothing... */ }
// ...
};
这是一个live example with polymorphic types,表明代码编译(删除虚拟析构函数会导致编译错误similar to the one you are seeing)。
正如评论中Luc Danton正确提到的那样,可以通过这种方式定义虚拟析构函数的默认版本(如果您的编译器在这方面符合C ++ 11标准):
class Event
{
public:
virtual ~Event() = default;
// ...
};
答案 1 :(得分:3)
要执行dynamic_cast
,您要投射的类型必须是多态的。为此,它必须拥有或继承一些虚拟成员。确保Event
具有虚拟成员函数(至少是虚拟析构函数)。