重写析构函数是好的做法吗?
Is it good practice to override the destructor?
override
析构函数是好的做法吗?为什么或为什么不呢? 例:
class Foo : Base
{
public:
~Foo() override {}
};
struct Base {
virtual ~Base() {}
};
struct Foo : Base {
~Foo() override {}
};
这将编译。
struct Base {
~Base() {}
};
struct Foo : Base {
~Foo() override {}
};
这不。
struct Base {
~Base() {}
};
struct Foo : Base {
virtual ~Foo() {}
};
这将编译。
活生生的例子。
如果您的目标是在Foo
中声明您希望Base
具有virtual
析构函数,最简单的方法是在~Foo
上使用override
关键字。 由于通过Base*
删除Foo*
的语义会根据~Foo
是否virtual
而发生显着变化,这可能对某些人有用。
其他人可能会因为使用术语override
来指代这种情况而感到冒犯。
确定人们因使用override
而受到冒犯是否比能够在Foo
中声明Base
具有虚拟析构函数更重要或更不重要,因此通过指向Base
的指针删除Foo
实例是定义的行为。 我不能为你做这个决定。
正如@HowardHinnant在注释中所述,添加显式析构函数会产生后果;如果这样做,请遵循 5 法则并=default
、=delete
或实现复制/移动对象构造/赋值运算符。
static_assert
Base
具有虚拟析构函数可能更容易,除非您出于其他原因需要析构函数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 重写析构函数 - C++
- 重写析构函数是好的做法吗?
- 在派生类中重写哪个基类的虚拟析构函数
- 重写默认构造函数/析构函数而不实现它们
- 重写std的析构函数:异常
- 重写C++11中析构函数后的标识符
- 是否可以重写MyClass*(而不是MyClass)的析构函数
- 是否应该初始化具有未重写的纯虚拟析构函数的类
- 重写析构函数C++
- 重写过程中调用析构函数时的类成员