c++ - Base Class中虚析构函数的实用性
问题描述
让我们举这个例子:
/* Source.cpp */
struct Base {
virtual void func() = 0;
};
struct Derived : public Base {
virtual void func() override { }
};
int main() {
return 0;
}
通过编译(在 g++ 8.3.0 上)g++ Source.cpp -Wnon-virtual-dtor
我们得到:
Source.cpp:2:8: warning: 'struct Base' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
struct Base {
^~~~
Source.cpp:6:8: warning: base class 'struct Base' has accessible non-virtual destructor [-Wnon-virtual-dtor]
struct Derived : public Base {
^~~~~~~
Source.cpp:6:8: warning: 'struct Derived' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
什么是实际的事情?
- 添加
virtual ~Base() = default;
到每个此类Base
以消除警告(缺点是我们正在添加样板代码,这本质上似乎没有做任何事情)。 - 或者是否有一个参数可以删除
-Wnon-virtual-dtor
并保持代码不变?(缺点是我们可能允许内存泄漏,或者我们是) - 我想一个值得问的问题是,如果类有虚拟成员,为什么编译器不创建虚拟默认析构函数?
解决方案
推荐阅读
- c# - 使用 Unity3D 写入 HoloLens 2 上的 Application.persistentDataPath,然后通过设备门户网站访问文件
- python - 如何使“Python / C API”中的函数可用?
- r - 替换 NA 值
- java - 测试在本地 Windows 机器上工作,但在 Linux 服务器上失败
- jsoup - 如何阻止 jsoup.clean 取消转义 € 和其他特殊字符
- python-3.x - 正则表达式使用 match 方法匹配 python3 中的模式
- c - 使用 Tcl C API 的 Lib 崩溃可能是由于错误的 refCount 使用
- prolog - Prolog:过滤目标列表并保留成功的目标
- javascript - 如何将 .content().filter 方法从 jquery 转换为 vanilla javascript
- swift - 最小化 macOS 应用程序 + 分布式通知中心(macOS 上的后台模式)