【问题标题】:What is the best practice for derived class destruction?派生类销毁的最佳实践是什么?
【发布时间】:2020-11-02 11:10:18
【问题描述】:

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

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

还有已知的最佳实践吗?

【问题讨论】:

  • 1.和 2. 是一样的。 override 只是给你编译器检查。 3.和4.也一样。 virtual 派生到子类。在子类中没有必要。如果设置了overridevirtual 是多余的。恕我直言 dont declare a destructor if you don't need it, declare a destructor with override` 和 default 如果您需要声明,如果您需要自定义析构函数,请使用 override 声明析构函数。

标签: c++ c++11 destructor


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多