gpt4 book ai didi

c++ - 非多态派生类的基类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:20 24 4
gpt4 key购买 nike

我有以下类定义:

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_ptrstd::vector ,您不仅不必手动调用 newdelete 来避免内存泄漏,而且智能指针还有一个神奇的属性(它存储删除器以调用销毁基于它的构建方式)解决了你的问题:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com