使用dynamic_pointer_cast时不能进行动态强制转换
Cannot dynamic cast when using 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
…
我该怎么做呢?
编译器在消息末尾告诉你发生了什么:
(源类型不是多态的)
你的Event
基类需要至少有一个virtual
成员函数(即是一个多态类型),以便允许动态强制转换。可以将Event
的析构函数设置为虚函数:
class Event
{
public:
virtual ~Event() { /* whatever goes here, or nothing... */ }
// ...
};
这是一个多态类型的实例,显示了代码编译(删除虚析构函数会导致类似于您看到的编译错误)。
正如Luc Danton在注释中正确提到的,虚析构函数的默认版本可以这样定义(如果你的编译器在这方面是c++ 11兼容的):
class Event
{
public:
virtual ~Event() = default;
// ...
};
要执行dynamic_cast
,要转换的类型必须是多态的。要使其为真,它必须具有或继承一些虚成员。确保Event
有一个虚成员函数(至少有一个虚析构函数)。
相关文章:
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 重构使用动态强制转换的 std::set 的比较运算符
- 指针类型类成员的动态强制转换的恒定性是什么?
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 为了访问方法,从基类动态转换为派生类
- 如何对以下程序使用静态或动态转换
- 使用静态转换,因为动态转换失败.不好的做法?
- 动态转换 qspinbox 到 qdoublespinbox
- C++动态转换失败/子对象被视为父对象
- 关于带有模板类的C++动态转换
- 将基体动态转换为派生对象
- sharedptr的动态转换
- 如何动态转换模板类
- 动态转换中的错误
- 如何从另一个kext动态转换类
- Xerces.动态转换DOMNode指针到DOMElement返回一个nullptr
- 难以理解c风格的类型转换和动态转换
- 引用的动态转换
- 是否可以在c++中的类似接口的体系结构中使用动态转换