为什么默认情况下析构函数不是虚拟的

简介: 为什么默认情况下析构函数不是虚拟的

因为很多类并不是设计来作为基类使用的, 虚函数仅在用作派生类对象接口的类中有意义(通常分配在堆上并通过指针或引用访问)。

那么我什么时候应该声明一个析构函数为虚拟的呢? 每当该类具有至少一个虚函数时。 拥有虚函数表明一个类是作为一个派生类的接口,如果是派生类的对象可以通过指向基类的指针销毁。 例如:

class Base {

       // ...

       virtual ~Base();

   };


   class Derived : public Base {

       // ...

       ~Derived();

   };


   void f()

   {

       Base* p = new Derived;

       delete p;    // 用于确保调用 ~Derived 的虚拟析构函数

   }    

如果 Base 的析构函数不是虚拟的,Derived 的析构函数就不会被调用 - 可能产生不良影响,例如 Derived 拥有的资源不 被释放

 

相关文章
|
11月前
|
分布式计算 Java 持续交付
如何选择合适的微服务框架
如何选择合适的微服务框架
252 0
|
JavaScript 前端开发 编译器
你知道Vue 3.0中Treeshaking特性吗?
你知道Vue 3.0中Treeshaking特性吗?
382 0
|
Linux
Centos查看已经安装的软件或者包
Centos查看已经安装的软件或者包
573 0
|
12月前
|
机器学习/深度学习 PyTorch 算法框架/工具
探索PyTorch:张量的类型转换,拼接操作,索引操作,形状操作
探索PyTorch:张量的类型转换,拼接操作,索引操作,形状操作
|
存储 SQL 关系型数据库
关系型数据库和非关系型数据库的区别和选择方法?
【8月更文挑战第17天】关系型数据库和非关系型数据库的区别和选择方法?
997 0
|
测试技术
仓储设计实现问题之当系统较为简单时选择仓储开发方式如何解决
仓储设计实现问题之当系统较为简单时选择仓储开发方式如何解决
|
存储 算法 Java
Java程序设计实验2 | Java语言基础(二)
分别用do-while和for循环计算1+1/2!-1/3!+1/4!-1/5!…的前20项之和。
157 1
|
存储 编译器 C++
『C++成长记』拷贝构造函数
『C++成长记』拷贝构造函数
210 1
|
IDE Java Maven
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
355 1
|
消息中间件 物联网 API
阿里云物联网平台入门-设备消息上传
阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。此篇文章按照官方入门实例操作下设备消息的上传
1058 9
阿里云物联网平台入门-设备消息上传