我有以下类定义:
class BaseHandle { /* Lots of things */ };
class VertexHandle : public BaseHandle {
/* Only static members and non-virtual functions, default dtor */ };
class EdgeHandle : public BaseHandle { /* Dito */ };
class FaceHandle : public BaseHandle { /* Dito */ };
所有类都没有虚函数或基类。
派生类仅派生自 BaseHandle
,不添加任何非静态成员,也不添加非默认 dtor。
我想将 Vertex-
、Edge-
和 FaceHandles
保存在同一个 vector 中:
std::vector<BaseHandle*> handles;
但它不起作用,如果我检索 BaseHandle
对象并想将它们 dynamic_cast
到派生对象,它会失败,因为类不是多态的(那是我的解释可能是我错了)。
如何实现 BaseHandles
的通用 vector ?我应该提一下,我无法更改类定义,因为它们是第三方库的一部分。
最佳答案
你需要在你的父类中有一个虚拟析构函数才能以多态方式使用它
class BaseHandle
{
public:
virtual ~BaseHandle();
...
};
那是因为 dynamic_cast
与 RTTI(运行时类型信息)一起工作,只有当您的类至少有一个虚拟成员函数时才可用
而且这样也可以防止资源泄露,否则只有你的实例的父类部分会被销毁
解决方法
您可以使用 std::shared_ptr
的 std::vector
,您不仅不必手动调用 new
和 delete
来避免内存泄漏,而且智能指针还有一个神奇的属性(它存储删除器以调用销毁基于它的构建方式)解决了你的问题:
int main()
{
std::vector<std::shared_ptr<BaseHandle>> shared_vec;
shared_vec.push_back(std::make_shared<VertexHandle>());
} // At the end of scope all destructors are called correctly
如果您无法访问 c++11,您可以使用 boost::shared_ptr
关于c++ - 非多态派生类的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291884/