我想定义一个如下所示的类:
class IHaveVirtualDestructor
{
public:
virtual ~IHaveVirtualDestructor();
};
我希望我所有的接口和抽象类都继承这个类。这是一个好习惯吗?还是每个接口/抽象类都应该定义自己的虚拟析构函数?有什么缺点?
我想定义一个如下所示的类:
class IHaveVirtualDestructor
{
public:
virtual ~IHaveVirtualDestructor();
};
我希望我所有的接口和抽象类都继承这个类。这是一个好习惯吗?还是每个接口/抽象类都应该定义自己的虚拟析构函数?有什么缺点?
我希望我所有的接口和抽象类都继承这个类。这是一个好习惯吗?
这听起来不错。好处更像是noncopyable
类。
任何从它们派生的类看起来就像是通过快速浏览来记录的,否则必须查看析构函数的声明以确保析构函数是否virtual
存在。
制作默认构造函数protected
将是一个好主意:
class IHaveVirtualDestructor
{
protected:
virtual ~IHaveVirtualDestructor() {} //make it protected as well
IHaveVirtualDestructor() {}
};
可能需要一个更好的名称:
这取决于您是否认为忘记向类添加虚拟析构函数或添加 IHaveVirtualDestructor 作为基类更难。
如果我害怕这样的错误,我会倾向于使用静态代码分析器。
想想课堂上的读者。必须查找 IHaveVirtualDestructor。看到一个虚拟的、内联的和空的析构函数更加地道。
亲切的问候托斯滕
我不确定这是否值得,但如果我要这样做,我会给这个类起一个表达其目的的名称,而不是它的实现。像Interface
或之类的东西PolymorphicObject
。
如果基类析构函数定义为虚拟,则所有子类都将具有隐式虚拟析构函数。如果它的目的是强制子类定义虚拟析构函数,如果将析构函数定义为纯虚拟会更好,