3

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

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

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

4

4 回答 4

3

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

这听起来不错。好处更像是noncopyable类。

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

制作默认构造函数protected将是一个好主意:

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

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

  • 抽象库
  • PolymorphicObject (取自@James Kanze 的回答)
于 2012-07-16T11:05:04.860 回答
3

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

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

想想课堂上的读者。必须查找 IHaveVirtualDestructor。看到一个虚拟的、内联的和空的析构函数更加地道。

亲切的问候托斯滕

于 2012-07-16T11:30:15.323 回答
3

我不确定这是否值得,但如果我要这样做,我会给这个类起一个表达其目的的名称,而不是它的实现。像Interface或之类的东西PolymorphicObject

于 2012-07-16T11:16:52.197 回答
0

如果基类析构函数定义为虚拟,则所有子类都将具有隐式虚拟析构函数。如果它的目的是强制子类定义虚拟析构函数,如果将析构函数定义为纯虚拟会更好,

于 2012-07-16T11:11:08.993 回答