派生类销毁的最佳实践是什么?

时间:2020-07-13 09:13:42

标签: c++ c++11 destructor

我们知道,基类析构函数被标记为虚拟的,可以正确破坏派生类实例作为基类指针。那么下面的派生类析构函数实践之间有什么区别?

  1. 简单的析构函数:~Derived();
  2. 具有替代项的析构函数:~Derived() override;
  3. 具有覆盖项的默认析构函数:~Derived() override = default;
  4. 虚拟析构函数:virtual ~Derived() override = default;

还有已知的最佳做法吗?

1 个答案:

答案 0 :(得分:1)

入门:我们希望Baseclass::~Baseclass是虚拟的,class Derived是从Baseclass公开派生的。

  1. 简单析构函数:如果没有其他类(并且永远不会)从Derived派生,这就是您将要使用的基本方法。不要将所有析构函数都声明为虚拟的,而应按照2中的描述使用override关键字。例外:您创建了一个分片库,并希望人们从您的库中安全地派生类。

  2. 具有重写的析构函数:如果您声明一个派生类并想调用它的基类析构函数,请使用override。这样,如果您忘记将virtual添加到基类描述符中,则会出现编译错误。

  3. 具有重写和默认析构函数的析构函数:如果忘记声明基类析构函数为虚拟的,则还会收到编译错误。如果您不需要执行特殊的清理任务(例如,释放HEAP分配的内存),请使用此选项。更好/更清洁,然后写~Derived() {}

  4. 所有内容的组合:嗯,声明虚构的析构函数并使用重写没有好处。无论如何,Override会将方法(在这种情况下为析构函数)声明为虚拟方法。请参阅:https://en.cppreference.com/w/cpp/language/override。因此与3相同。