派生 class 销毁的最佳做法是什么?
What is the best practice for derived class destruction?
我们知道基 class 析构函数被标记为虚拟的,以便正确销毁派生 class 实例作为基类型指针。那么下面派生的class析构函数的做法有什么区别呢?
- 简单的析构函数:
~Derived();
- 带覆盖的析构函数:
~Derived() override;
- 带覆盖的默认析构函数:
~Derived() override = default;
- 虚拟析构函数:
virtual ~Derived() override = default;
还有已知的最佳实践吗?
入门:我们期望 Baseclass::~Baseclass
是虚拟的,并且 class Derived
是从 Baseclass
.
派生的 public
简单析构函数:如果没有其他 class(并且永远不会)从 Derived
派生,那么您将基本上使用它。不要将所有析构函数声明为虚拟的,但更喜欢使用 override
关键字,如 2 中所述。例外:您创建了一个分片库并希望人们安全地从您的库中获取 classes。
带覆盖的析构函数:如果您声明了派生 class 并想调用它的基础 class 析构函数,请使用 override
。这样,如果您忘记将 virtual
添加到 baseclass descstructor.
,您将得到一个编译错误
具有覆盖和默认析构函数的析构函数:如果您忘记声明基 class 析构函数虚拟,您也会遇到编译错误。如果您不需要执行特殊的清理任务(例如释放 HEAP 分配的内存),请使用它。 Better/cleaner 然后写 ~Derived() {}
所有的组合:好吧,声明一个析构函数为虚拟并使用重写没有任何好处。无论如何,Override 会将方法(在本例中为析构函数)声明为虚拟方法。参见:https://en.cppreference.com/w/cpp/language/override。所以和3一样。
我们知道基 class 析构函数被标记为虚拟的,以便正确销毁派生 class 实例作为基类型指针。那么下面派生的class析构函数的做法有什么区别呢?
- 简单的析构函数:
~Derived();
- 带覆盖的析构函数:
~Derived() override;
- 带覆盖的默认析构函数:
~Derived() override = default;
- 虚拟析构函数:
virtual ~Derived() override = default;
还有已知的最佳实践吗?
入门:我们期望 Baseclass::~Baseclass
是虚拟的,并且 class Derived
是从 Baseclass
.
简单析构函数:如果没有其他 class(并且永远不会)从
Derived
派生,那么您将基本上使用它。不要将所有析构函数声明为虚拟的,但更喜欢使用override
关键字,如 2 中所述。例外:您创建了一个分片库并希望人们安全地从您的库中获取 classes。带覆盖的析构函数:如果您声明了派生 class 并想调用它的基础 class 析构函数,请使用
,您将得到一个编译错误override
。这样,如果您忘记将virtual
添加到 baseclass descstructor.具有覆盖和默认析构函数的析构函数:如果您忘记声明基 class 析构函数虚拟,您也会遇到编译错误。如果您不需要执行特殊的清理任务(例如释放 HEAP 分配的内存),请使用它。 Better/cleaner 然后写
~Derived() {}
所有的组合:好吧,声明一个析构函数为虚拟并使用重写没有任何好处。无论如何,Override 会将方法(在本例中为析构函数)声明为虚拟方法。参见:https://en.cppreference.com/w/cpp/language/override。所以和3一样。