在我的C++应用程序中定义IHaveVirtualDestructor基类是一种好的做法吗

Is it a good practice to define IHaveVirtualDestructor base class in my C++ application?

本文关键字:一种 应用程序 C++ 我的 定义 基类 IHaveVirtualDestructor      更新时间:2023-10-16

我想定义一个如下所示的类:

class IHaveVirtualDestructor
{
public:
    virtual ~IHaveVirtualDestructor();
};

我希望我所有的接口和抽象类都继承这个类。这是一个好的做法吗?还是每个接口/抽象类都应该定义自己的虚拟析构函数?缺点是什么?

我不确定这是否值得,但如果我要这样做,我会给这个类一个名称来表达它的目的,而不是它的实现。类似InterfacePolymorphicObject的东西。

我希望我的所有接口和抽象类都继承这个类。这是一个好的做法吗?

听起来不错。其优点更类似于noncopyable类。

任何从它们派生的类看起来都像是通过快速浏览而记录的,否则必须查看析构函数的声明以确保析构函数是否为virtual

使默认构造函数protected是个好主意:

class IHaveVirtualDestructor
{
  protected:
     virtual ~IHaveVirtualDestructor() {} //make it protected as well
     IHaveVirtualDestructor() {}
};

可能需要一个更好的名称:

  • AbstractBase
  • PolymorphicObject(取自@James Kanze的回答)

这取决于您认为是更难忘记向类添加虚拟析构函数,还是更难忘记将IHaveVirtualDestructor添加为基类。

如果我害怕这样的错误,我会倾向于使用静态代码分析器。

想想课堂上的读者。必须查找IHaveVirtualDestructor。看到一个虚拟的、内联的、空的析构函数要习惯得多。

亲切问候Torsten

如果基类发行器定义为虚拟的,则所有子类都将具有隐式虚拟发行器。如果你将发行器定义为纯虚拟发行器,如果它的目的是强迫子类定义虚拟发行器(),那就更好了

相关文章: