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

标签 c++

我有以下类定义:

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/

相关文章:

c++ - 使用 OpenCV 捕获网络摄像头图像时可以设置颜色深度吗?

c++ - Visual Studio 未加载符号

c++ - 在 C++ 流中包装 C 风格的文件

c++ - CUDA:VFW - 编解码器 DLL

c++ - 当特定节点对之间存在多条最短路径时,boost graph dijkstra_shortest_paths 如何选择最短路径?

c++ - 书错了吗?

c++ - 使用 Q_DECLARE_METATYPE 声明 unsigned char[]

c++ - std::function 指向采用右值参数的成员函数的指针 MSVC 2010 SP1

c++ - 通常的算术转换如何工作?

c++ - 类声明之外的类转换