派生 class 销毁的最佳做法是什么?

What is the best practice for derived class destruction?

我们知道基 class 析构函数被标记为虚拟的,以便正确销毁派生 class 实例作为基类型指针。那么下面派生的class析构函数的做法有什么区别呢?

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

还有已知的最佳实践吗?

入门:我们期望 Baseclass::~Baseclass 是虚拟的,并且 class Derived 是从 Baseclass.

派生的 public
  1. 简单析构函数:如果没有其他 class(并且永远不会)从 Derived 派生,那么您将基本上使用它。不要将所有析构函数声明为虚拟的,但更喜欢使用 override 关键字,如 2 中所述。例外:您创建了一个分片库并希望人们安全地从您的库中获取 classes。

  2. 带覆盖的析构函数:如果您声明了派生 class 并想调用它的基础 class 析构函数,请使用 override。这样,如果您忘记将 virtual 添加到 baseclass descstructor.

    ,您将得到一个编译错误
  3. 具有覆盖和默认析构函数的析构函数:如果您忘记声明基 class 析构函数虚拟,您也会遇到编译错误。如果您不需要执行特殊的清理任务(例如释放 HEAP 分配的内存),请使用它。 Better/cleaner 然后写 ~Derived() {}

  4. 所有的组合:好吧,声明一个析构函数为虚拟并使用重写没有任何好处。无论如何,Override 会将方法(在本例中为析构函数)声明为虚拟方法。参见:https://en.cppreference.com/w/cpp/language/override。所以和3一样。