您现在的位置是:首页 > 正文

关于虚析构函数的使用

2024-04-13 17:45:53阅读 425

虚析构函数(Virtual Destructor)是在面向对象编程中处理多态性的一个重要概念。它在基类中声明为虚函数,并且在派生类中可能会被覆盖(重写)。虚析构函数的作用是确保在删除指向派生类对象的基类指针时,能正确调用派生类的析构函数,从而避免内存泄漏和未定义行为。

下面是虚析构函数的基本概念和用法:

  1. 基本概念:
  • 当基类的析构函数声明为虚函数时,它会具备动态绑定的特性。这意味着在删除一个指向派生类对象的基类指针时,将会调用适当的派生类析构函数。
  • 虚析构函数只需要在基类中声明为虚函数,不需要在派生类中显式地声明为虚函数,但是如果派生类需要在析构时进行特殊的资源清理,那么它可以在派生类中重写(覆盖)虚析构函数。
  1. 使用场景: 虚析构函数特别适用于以下情况:
  • 当通过基类指针管理派生类对象,并且在程序运行期间会进行基类指针的释放(delete),以避免内存泄漏。
  • 当派生类中有动态分配的资源(比如堆内存、文件句柄等),需要在析构时进行释放。

示例代码如下:

#include <iostream> 
class Base {
public: // 虚析构函数 
    virtual ~Base() {
     std::cout << "Base class destructor" << std::endl; 
    }
}; 
class Derived : public Base {
public: // 派生类可以不显式声明虚析构函数,但它仍然继承了基类的虚析构函数 
// 重写虚析构函数,进行派生类资源的清理 
    ~Derived() override { 
        std::cout << "Derived class destructor" << std::endl; 
    } 
}; 
int main() {
    Base* ptr = new Derived(); 
    // 使用基类指针指向派生类对象 
    // 通过基类指针删除对象,会正确调用派生类析构函数 
    delete ptr; 
    return 0; 
}

在上面的示例中,我们使用基类指针 Base* ptr 指向派生类对象 new Derived(),然后通过 delete ptr 删除指针,由于基类的析构函数声明为虚函数,所以在释放指针时会调用派生类的析构函数 ~Derived(),以正确清理派生类的资源。如果没有将基类析构函数声明为虚函数,将无法正确调用派生类的析构函数,导致派生类资源泄漏。

最后,写文不易,不收藏也请给个赞,谢谢亲~! 

(本文仅供学习时参考,如有错误,纯属作者技术不到位,不足之处请多指教,谢谢)

网站文章

  • 机器人中的数值优化(十九)—— SOCP锥规划应用:时间最优路径参数化(TOPP)

    机器人中的数值优化(十九)—— SOCP锥规划应用:时间最优路径参数化(TOPP)

    本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

    2024-04-13 17:45:46
  • 中国大学(慕课)哈工大C语言程序设计精髓练兵区第一周

    这是第一周的一些东西 简单记录一下1、题目内容:使用printf()在屏幕上输出 hello world! #include <stdio.h>int main(){ printf("hello world!\n"); return 0;}2、题目内容:在屏幕上输出多行信息使用printf()函数在屏幕上输出以下多行信息:hello world!hell...

    2024-04-13 17:45:23
  • Jmeter-如何知道哪个接口可以使用cookie管理器获取的值

    Jmeter-如何知道哪个接口可以使用cookie管理器获取的值

    在jmeter内,有cookie管理器可以专门管理接口的cookie值信息。cookie值的获取有两种方式,一个是手动获取,一个是自动获取。手动获取1.在登录或其他能产生cookie的请求后增加后置处...

    2024-04-13 17:45:16
  • Java数据结构与算法分析——冒泡排序

    Java数据结构与算法分析——冒泡排序

    现存在一个无序数组{1,9,7,5,3},请利用冒泡排序将数组按照从小到大(从大到小)排序。第一趟:一共五个数,比较了4回,流程如下:

    2024-04-13 17:45:10
  • #define宏定义是什么?怎么写?一文搞懂。

    #define宏定义是什么?怎么写?一文搞懂。

    ###前言 最开始接触宏定义的时候是在学校的C++课程上,当时只是见过它一眼,没有深究,它给我的感觉像定义一个变量一样。之后在刷题的过程中接触到了CodeForce平台,里面可以看到每个人提交的代码。...

    2024-04-13 17:45:02
  • JS 数组去重复数据、处理数组数据

    需求: 用*打印出,星号金字塔 // 星号金字塔 function text(num) { for (let i = 1; i &lt;= num; i++) { let str = &quot;&quot; for (let j = 0; j &lt;= num + i - 1; j++) { if (j &lt;= num - i) { str += &#39; &#39; } else {

    2024-04-13 17:44:40
  • JS简单数据类型和复杂数据类型(全)

    1. 简单类型和复杂类型 简单类型 简单类型又叫做基本数据类型或者值类型 值类型: 简单数据类型/基本数据类型,在存储变量中存储的是值本身,因此叫做值类型 String、number、Boolean、...

    2024-04-13 17:44:35
  • java RSA 加密/解密

    package cn.shinkong.cxf.security;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.KeyP

    2024-04-13 17:44:28
  • html+widget+制作工具,jQuery UI 实例

    jQuery UI 实例 - 部件库(Widget Factory)使用与所有 jQuery UI 小部件相同的抽象化来创建有状态的 jQuery 插件。如需了解更多有关部件库(Widget Fact...

    2024-04-13 17:44:07
  • IDEA自定义文件识别格式

    IDEA自定义文件识别格式

    IDEA自定义文件识别格式?​最近有使用velocity模板引擎开发一些前端页面,但是却发现IDEA并不能识别其语法格式(将其html代码部分识别出来)。经过搜索发现IDEA其实是支持自定义指定文件后...

    2024-04-13 17:44:01