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

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

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

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

class Base {

       // ...

       virtual ~Base();

   };


   class Derived : public Base {

       // ...

       ~Derived();

   };


   void f()

   {

       Base* p = new Derived;

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

   }    

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

 

相关文章
|
5月前
|
消息中间件 Java 数据安全/隐私保护
RabbitMQ入门
RabbitMQ是基于Erlang开发的开源消息中间件,支持AMQP协议,实现应用间解耦与异步通信。其核心组件包括生产者、消费者、队列、交换机和虚拟主机,可通过Docker快速部署并结合SpringAMQP实现消息收发。
|
存储 编译器 C++
『C++成长记』拷贝构造函数
『C++成长记』拷贝构造函数
466 1
|
JavaScript 前端开发 编译器
你知道Vue 3.0中Treeshaking特性吗?
你知道Vue 3.0中Treeshaking特性吗?
503 0
|
分布式计算 Java 持续交付
如何选择合适的微服务框架
如何选择合适的微服务框架
428 0
|
存储 算法 Java
Java程序设计实验2 | Java语言基础(二)
分别用do-while和for循环计算1+1/2!-1/3!+1/4!-1/5!…的前20项之和。
251 1
|
测试技术
仓储设计实现问题之当系统较为简单时选择仓储开发方式如何解决
仓储设计实现问题之当系统较为简单时选择仓储开发方式如何解决
120 0
|
PHP
php基础语法
php基础语法
231 2
|
安全 前端开发 Java
JVM学习三
2.编译javap 通过javap工具,我么可以反编译class文件,从而看到java的字节码信息: javap -v xxx.class 从字节码文件中,我们可以看到类的文件的相关信息,版本信息、字段、常量池信息、属性信息、方法信息,继承信息和标识信息等。 通常原始java代码,编译后变成字节码文件,常量信息,会放入常量池中,运行时放入到运行时常量池中。而运行常量池类似hash表,在里面可以看到里面的常量的信息。方法字节码载入方法区,main线程开始运行,分配栈帧内存。而栈帧的数据结构是栈,先进后出的特点。接着执行引擎完成字节码操作。 在编译过程期间,会自动生成和转换一些代码,方便运行。
206 1
JVM学习三
|
机器学习/深度学习 分布式计算 算法
推荐系统入门之使用ALS算法实现打分预测
本场景介绍如何使用ALS算法实现用户音乐打分预测。
|
Java 开发者 Spring
Spring 中后置处理器的作用?
Spring 中后置处理器的作用?
383 0

热门文章

最新文章