覆盖析构函数是一种好习惯吗?

vol*_*nto 7 c++ overriding destructor c++11

override析构函数是好的做法吗?为什么或者为什么不?例:

class Foo : Base
{
public:
    ~Foo() override {}
};
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 5

struct Base {
  virtual ~Base() {}
};
struct Foo : Base {
  ~Foo() override {}
};
Run Code Online (Sandbox Code Playgroud)

这个编译.

struct Base {
  ~Base() {}
};
struct Foo : Base {
  ~Foo() override {}
};
Run Code Online (Sandbox Code Playgroud)

这不.

struct Base {
  ~Base() {}
};
struct Foo : Base {
  virtual ~Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

这编译.

实例.

如果您的目标是Foo声明您希望Base有一个virtual析构函数,那么最简单的方法是使用override关键字on ~Foo.由于删除的语义Foo*通过Base*显著取决于如果变化~Foovirtual,这可能是对某些人有用.

其他人可能会因使用该术语override来指代这种情况而受到冒犯.

确定是否被人利用offenced override较多,或比能说出在不太重要Foo的是Base有一个虚析构函数,所以删除的实例,Foo通过指针Base被定义的行为.我无法为你做出决定.

正如@HowardHinnant在评论中所述,添加显式析构函数会产生后果; 如果这样做,请遵循5的规则=default,=delete或者实现复制/移动对象构造/赋值运算符.

这可能是更容易static_assert的是Base有一个虚析构函数,除非你需要一些其他原因的析构函数.

  • 同意(和赞成).但是也要考虑使用隐式声明的析构函数是否最好.当您添加析构函数(`或覆盖`)时,您隐式禁用隐式声明的移动成员.如果您的副本成员是隐式的,那么您依赖于已弃用的行为.在添加用户声明的析构函数时,应该全部考虑这一点.添加析构函数_only_以便将其标记为"覆盖"可能是过度的.还有其他方法可以确保`~Foo()`是`virtual`,例如:`static_assert(std :: has_virtual_destructor <Foo> {})`. (4认同)