6

为什么这段代码不起作用?

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()可能会返回类型EventTrackerEvent. 我希望当我尝试将它投射到TrackerEvent它并返回时,NULL我会知道我是否有一个EventTrackerEvent......

我该怎么做?

4

2 回答 2

11

编译器会在消息末尾告诉您发生了什么:

(源类型不是多态的)

您的Event基类需要至少有一个virtual成员函数(即多态类型)才能允许动态转换。您可以制作Event虚拟的析构函数:

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

这是一个带有多态类型的实时示例,显示代码可以编译(删除虚拟析构函数会导致与您看到的类似的编译错误)。

正如Luc Danton在评论中正确提到的那样,可以通过这种方式定义虚拟析构函数的默认版本(如果您的编译器在这方面符合 C++11):

class Event
{
public:
    virtual ~Event() = default;
    // ...
};
于 2013-05-04T13:15:22.657 回答
3

要执行 a dynamic_cast,您从中转换的类型必须是多态的。要做到这一点,它必须拥有或继承一些虚拟成员。确保Event有一个虚拟成员函数(至少是一个虚拟析构函数)。

于 2013-05-04T13:15:06.140 回答