派生类销毁的最佳实践是什么
What is the best practice for derived class destruction?
我们知道基类析构函数被标记为虚拟的,以便正确地销毁作为基类型指针的派生类实例。那么,以下派生类析构函数实践之间有什么区别呢?
- 简单析构函数:
~Derived();
- 带覆盖的析构函数:
~Derived() override;
- 带重写的默认析构函数:
~Derived() override = default;
- 虚拟析构函数:
virtual ~Derived() override = default;
还有已知的最佳实践吗?
Primer:我们希望Baseclass::~Baseclass
是虚拟的,class Derived
从Baseclass
派生为公共的。
-
简单析构函数:如果没有其他类(也永远不会(从
Derived
派生,那么这就是你基本上要使用的。不要将所有析构函数声明为虚拟的,但更喜欢使用override
关键字,如2中所述。例外:您创建了一个分片库,并希望人们安全地从您的库中分片类。 -
带重写的析构函数:如果您声明一个dervied类并想调用它的基类析构函数,请使用
override
。这样,如果您忘记将virtual
添加到基类destructor,就会出现编译错误。 -
带重写和默认析构函数的析构函数:如果忘记声明基类析构函数为virtual,也会出现编译错误。如果您不需要执行特殊的清理任务(例如释放HEAP分配的内存(,请使用此选项。比写入
~Derived() {}
更好/更干净 -
所有这些的结合:好吧,声明一个析构函数是虚拟的并使用重写没有任何好处。Override无论如何都会将方法(在本例中为destcurator(声明为虚拟方法。请参阅:https://en.cppreference.com/w/cpp/language/override.所以它和3是一样的。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 派生类销毁的最佳实践是什么
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?