C++'interfaces'应该有一个虚拟析构函数吗?

Mr.*_*Boy 47 c++

可能重复:
C++类接口类的析构函数

考虑一个C++抽象类的简单示例,用于建模接口:

class IAnimal
{
  virtual void walk()=0;
  virtual ~IAnimal(){}
};
Run Code Online (Sandbox Code Playgroud)

是否更好地拥有析构函数?我不认为析构函数可以是纯虚拟的,至少我的测试会给出链接器错误,所以是否应该包含空的析构函数?

编辑:对不起,错字.它是一个析构函数而不是构造函数.

whe*_*ies 47

您应该始终使用带有接口的虚拟析构函数.例证:

IAnimal* animal = new Lion();
delete animal;
Run Code Online (Sandbox Code Playgroud)

现在它将使用什么析构函数?绝对不是Lion的析构函数,因为界面不知道Lion的析构函数.

所以,如果您的界面没有内存管理,请使用此选项:

virtual ~IAnimal(){}
Run Code Online (Sandbox Code Playgroud)

  • 您可以将纯说明符添加到接口的析构函数中,但链接器仍然需要实现它,如下所示:`virtual~INnimal()= 0 {}`. (3认同)

Chu*_*dad 20

看看这个文章香草萨特

特别是这部分:

仅针对析构函数的特殊情况:

准则#4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

这假定基类是一个"接口"类,因为它应该是.


Mik*_*our 5

这取决于您是否打算使用指向接口类的指针以多态方式管理对象的生命周期.

如果这样做,那么析构函数必须是虚拟的,以便正确删除对象.删除没有虚拟析构函数的基类指针是无效的,并提供未定义的行为.

如果不这样做,那么您应该通过使析构函数非虚拟和受保护来强制执行此操作,因此只能删除派生类.