C++复习笔记--虚析构和纯虚析构的使用

2023-11-01

目录

1--前言

2--虚析构和纯虚析构

3--代码实例

3-1--父类对象无法调用子类析构函数

3-2--虚析构实现

3-3--纯虚析构实现


1--前言

        在使用多态时,如果子类的属性开辟到堆区,那么父类指针在释放时将无法调用子类的析构代码,此时需要将父类中的析构函数修改为虚析构或者纯虚析构;

2--虚析构和纯虚析构

① 虚析构和纯虚析构的共性:

        可以解决前言存在的问题,即解决父类指针无法调用子类析构函数释放堆区数据的问题;

        虚析构和纯虚析构都需要具体的函数实现,即需实现函数体的内容;

② 虚析构和纯虚析构的区别:

        纯虚析构的类为抽象类,不能实例化对象,而虚析构的类可以实例化对象;

// 虚析构语法:
virtual ~类名(){}
 
// 纯虚析构语法:
virtual ~类名() = 0;

3--代码实例

3-1--父类对象无法调用子类析构函数

# include <iostream>
# include <string>
 
class Animal{
public:
    // 纯虚函数
    Animal(){
        std::cout << "Animal的构造函数调用" << std::endl;
    }
    ~Animal(){
        std::cout << "Animal的析构函数调用" << std::endl;
    }
    virtual void speak() = 0;
};
 
class Cat :public Animal{
public:
 
    Cat(std::string name){
        std::cout << "Cat的构造函数调用" << std::endl;
        Name = new std::string(name);
    }
 
    virtual void speak(){
        std::cout << *Name << " Cat is speaking" << std::endl;
    }
 
    ~Cat(){
        if(Name != NULL){
            std::cout << "Cat的析构函数调用" << std::endl;
            delete Name;
            Name = NULL;
        }
    }
 
    std::string *Name;
};
 
int main(){
    Animal * animal = new Cat("Tom");
    animal->speak();
    // 父类指针析构时,不会调用子类的析构函数,如果子类含有堆区数据,会出现内存泄露
    delete animal; 
    return 0;
}

        程序执行结果表明:没有调用子类 Cat 的析构函数,堆区数据无法有效释放,导致内存泄露;

3-2--虚析构实现

# include <iostream>
# include <string>

class Animal{
public:
    // 纯虚函数
    Animal(){
        std::cout << "Animal的构造函数调用" << std::endl;
    }
    // 利用虚析构可以解决父类指针释放子类对象的问题
    virtual ~Animal(){
        std::cout << "Animal的析构函数调用" << std::endl;
    }
    virtual void speak() = 0;
};

class Cat :public Animal{
public:

    Cat(std::string name){
        std::cout << "Cat的构造函数调用" << std::endl;
        Name = new std::string(name);
    }

    virtual void speak(){
        std::cout << *Name << " Cat is speaking" << std::endl;
    }

    ~Cat(){
        if(Name != NULL){
            std::cout << "Cat的析构函数调用" << std::endl;
            delete Name;
            Name = NULL;
        }
    }

    std::string *Name;
};

int main(){
    Animal * animal = new Cat("Tom");
    animal->speak();
    // 父类指针析构时,不会调用子类的析构函数,如果子类含有堆区数据,会出现内存泄露
    delete animal; 
    return 0;
}

3-3--纯虚析构实现

# include <iostream>
# include <string>

class Animal{
public:
    // 纯虚函数
    Animal(){
        std::cout << "Animal的构造函数调用" << std::endl;
    }
    // 利用纯虚析构可以解决父类指针释放子类对象的问题
    // 纯虚析构
    virtual ~Animal() = 0;
    virtual void speak() = 0;
};

// 纯虚析构也需要具体实现
Animal::~Animal(){
    std::cout << "Animal的纯虚析构函数调用" << std::endl;
}

class Cat :public Animal{
public:

    Cat(std::string name){
        std::cout << "Cat的构造函数调用" << std::endl;
        Name = new std::string(name);
    }

    virtual void speak(){
        std::cout << *Name << " Cat is speaking" << std::endl;
    }

    ~Cat(){
        if(Name != NULL){
            std::cout << "Cat的析构函数调用" << std::endl;
            delete Name;
            Name = NULL;
        }
    }

    std::string *Name;
};

int main(){
    Animal * animal = new Cat("Tom");
    animal->speak();
    // 父类指针析构时,不会调用子类的析构函数,如果子类含有堆区数据,会出现内存泄露
    delete animal; 
    return 0;
}

         通过实现父类的虚析构和纯虚析构,使得父类指针调用子类对象的析构函数,从而释放子类对象在堆区创建的数据,防止内存泄露;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++复习笔记--虚析构和纯虚析构的使用 的相关文章

随机推荐

  • yolo3训练自己的模型 基于TensorFlow-keras( python)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 所用到的版本 二 训练自己的模型 1 打开下载的yolo文件夹 2 建立如下目录 3 标记目标 4 修改配置 4 运行test py文件 5 运行trai
  • C++ 实现字符串逆序Hello World,输出olleH dlrow

    定义一个命名空间Myspace 包含以下函数 将一个字符串中的所有单词进行反转 并输出反转后的结果 例如 输入字符串为 Hello World 输出结果为 olleH dlrow 并在主函数内测试该函数 include
  • vue-cli3.0+tinymce实现富文本效果

    前言 之前vue用的富文本插件 tinymce 感觉还是停实用的 正好最近又用到了 在这里分享下 最下面提供中文文档 需要更多功能 或者感觉有不详细的可以看下 也可以留言问我 我看到肯定会回复的 效果 步骤 第一 安装两个插件 前者是 ti
  • JavaFX技巧6:使用透明颜色

    为用户界面元素选择正确的颜色始终是一个很大的挑战 但是当您开发可重用的框架控件时 开发人员就无法控制使用它们的应用程序的外观和感觉 这甚至更具挑战性 尽管您可能总是将元素添加到默认的灰色背景之上 但是嵌入控件的开发人员可能更倾向于哥特式风格
  • Qt交叉编译到arm平台

    从网上下载对应版本的Qt源码 https download qt io archive qt 5 9 5 9 3 single 我下载的是5 9 3的版本 解压到ubuntu上 下载使用gcc 4 9 4编译器 并配置环境变量 尽量选择高版
  • 物联网技术在智慧城市建设应用中的难点与疑点

    物联网技术在智慧城市建设应用中的难点与疑点 本文由本人发表 中国安防 第141期 2017年7月刊智慧城市栏目 徐建明 佳都科技 18971024137 Xujianming pcitech com 一 引言 物联网 概念首先由美国麻省理工
  • 这些嵌入式系统安全性的知识你需要了解

    这可能是 工程师在面对嵌入式系统应用程序的安全性时可能提出的第一个问题 不幸的是 有大量的 安全软件包 可用 并且对安全性不熟悉的嵌入式工程师可能只将安全性称为加密或病毒防护 尽管加密是安全性的一种工具 而病毒扫描程序从技术上讲可以提供安全
  • 物联网毕业设计选题推荐100例

    文章目录 1 前言 2 选题分享 2 1 嵌入式方向 2 2 算法方向 2 3 移动通信方向 2 4 学长作品展示 2 选题技巧 2 1 如何避坑 重中之重 2 2 难度把控 2 3 题目名称 3 最后 1 前言 这是学长亲手整理的物联网相
  • 无线华为能连苹果不能连接到服务器,华为手机连苹果Mac,连不上?手把手教你...

    一直都用数据线 将华为手机里的内容保存到Mac中 作为备份 比如很多大的照片 用微信等一张张传 再一张张下载又容易失真 又耽误时间 所以还是直接读取手机的内容比较方便 最近才知道有华为分享这个方法 可是按照华为官方方法 长按手机 华为分享
  • STM32F103ZET6【标准库函数开发】------05.通用定时器TIM5四个通道输出PWM信号

    STM32有四个通用定时器 现在介绍TIM5输出4路PWM的方法 下面展示主要的time c main c函数的代码 include timer h void TIM5 PWM Init u16 arr u16 psc GPIO InitT
  • SpringMVC+自定义注解实现注解拦截器

    目的 通过注解标注该请求需要进行拦截 1 自定义注解 创建名为LoginInterceptor的注解 生成javadoc时会包含注解 Documented 作用域 Target ElementType METHOD ElementType
  • PS图层混合模式超详细解答-图层混合模式的原理(Part1)

    PS图层混合模式超详细解答 图层混合模式的原理 前言 本教程非常详细 请用心看完 本教程如果有如何问题 欢迎评论区留言讨论 本教程为了避免冗余 一些不必要的截图就省略了 本教程只讨论8bit的情形下的混合 未经许可 不可转载 饮茶 在一切开
  • 【LeetCode 每日一题】53. 最大子数组和

    01 题目描述 给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 02 示例 示例1 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连
  • 服务器安装/卸载MySQL5.7

    服务器安装 卸载MySQL5 7 本文章使用的是CentOS7 6 一 安装 1 下载MySQL 下载软件 wget i c http dev mysql com get mysql57 community release el7 10 n
  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10582

    Exception in thread main java lang ArrayIndexOutOfBoundsException 10582 at com thoughtworks paranamer BytecodeReadingPar
  • 【开发工具】PyChram的下载和安装(windows系统)

    PyChram的下载和安装目录 一 PyChram的下载 二 PyChram的安装 三 PyChram的使用 一 PyChram的下载 PyCharm是 种Python IDE 集成开发环境 分为专业版 professional 和社区版
  • Python 计算机视觉(二) —— OpenCV 基础

    目录 1 安装配置 2 OpenCV 基础语法 1 读取图像并显示 2 调整显示窗口大小 3 调整图像尺寸大小 4 图像灰度处理 3 几何图形绘制 1 绘制线段 2 绘制矩形 3 绘制圆形 4 绘制椭圆 5 添加文本 总结 1 安装配置 打
  • odoo14 只编辑状态可见或只读状态可见

    odoo源码定义了两个类 oe read only oe edit only oe read only 只在只读状态下内容可见 编辑状态不可见 oe edit only 只在编辑状态下内容可见 只读状态不可见 使用环境 1 可以定义按钮只在
  • 小伙伴们要的安装指南——打开aiXcoder的正确方式

    作为国内用户最多的代码自动生成与补全产品 aiXcoder背后由当前SOTA的代码大模型为小伙伴们提供服务 包括智能代码生成 代码补全 代码搜索等功能 帮助小伙伴们自动完成 系列开发工作 提升开发效率和代码质量 以下是在IntelliJ I
  • C++复习笔记--虚析构和纯虚析构的使用

    目录 1 前言 2 虚析构和纯虚析构 3 代码实例 3 1 父类对象无法调用子类析构函数 3 2 虚析构实现 3 3 纯虚析构实现 1 前言 在使用多态时 如果子类的属性开辟到堆区 那么父类指针在释放时将无法调用子类的析构代码 此时需要将父