C++继承体系中,基类析构函数请加上virtual,设置为虚函数

这篇具有很好参考价值的文章主要介绍了C++继承体系中,基类析构函数请加上virtual,设置为虚函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么建议在存在继承体系时刻我们的类的析构函数加上virtual呢?

大家看段代码。

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

 咋一看,没什么毛病这段代码,让我们画图理解下。

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

紫框中的前4个字节指向new开辟的空间。

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

我们知道,当基类A指针指向基类B时候会发生切片

 C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

 当我们delete pa时候,编译器不会调用B类的析构函数在调用A类析构函数,而直接调用A类的析构函数。

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

 这时候会导致ptrb指向的空间丢失,导致内存泄露,这是我们不希望看见的。

整个时候我们的多态就要上场了。

这里有个前提:无论是哪一个类名字无论叫什么,编译器都会他的析构函数名字在运行时候改变为~destory()。所以其实所有的继承中,子类函数的析构函数都是隐藏了父类的析构函数

 C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

所以我们在继承体系中,应该将析构函数给设置为虚函数,这样在我们基类指针指向new出来的派生类的时候,在我们delete基类指针的时候,也可以调一下派生类析构,在调用基类的析构。而不是只调用基类的析构函数。

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

 让我们看看代码运行

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

 我们继承中为将基类析构写虚函数,导致pa指向new的B对象,delete后不调用B类的析构函数

导致ptrb指向的内存泄露

C++继承体系中,基类析构函数请加上virtual,设置为虚函数,c++,开发语言

当我们将基类的析构设置为虚函数后,pa在delete就会调用B类析构函数,在通过B类的析构函数结束后调用A类析构函数,最后释放空间。

 文章来源地址https://www.toymoban.com/news/detail-603536.html

 

到了这里,关于C++继承体系中,基类析构函数请加上virtual,设置为虚函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

    🏠专栏介绍:浅尝C++专栏是用于记录C++语法基础、STL及内存剖析等。 🎯每日格言:每日努力一点点,技术变化看得见。 我们生活中也有继承的例子,例如:小明继承了孙老师傅做拉面的手艺。继承就是一种延续、复用的方式。C++为了提高代码的可复用性,引入了继承机制,

    2024年04月10日
    浏览(38)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(30)
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也了解了C++中的模版,以及学习了几个STL的结构也相信大家都掌握

    2024年02月11日
    浏览(34)
  • 【C++】虚继承(virtual base classes)

    在多重继承(Multiple Inheritance) 的情况下,尤其是 菱形继承 时,容易出现问题,关于菱形继承见下图: 这个类 A 由另外两个类 B 和 C 继承。这两个类都继承到另一个新类 D 中 从图中我们可以看出,类 A 的数据/成员函数被两次继承到类 D。一个通过 B 类继承,另一个通过 C 类继

    2024年02月13日
    浏览(65)
  • C++的基类和派生类构造函数

    基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。

    2024年02月10日
    浏览(41)
  • C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段: 基础篇、STL 篇、高阶数据结构与算法篇 ,相关重点内容如下: 基础篇 : 类与对象 (涉及C++的三大特性等); STL 篇 : 学习使用 C++ 提供的 STL 相关库 ; 高阶数据结构与算

    2024年02月07日
    浏览(36)
  • C++ 类构造函数 & 析构函数

    类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地理解构造函数的概念: 当上面的代码

    2024年01月17日
    浏览(40)
  • 【C++】:构造函数和析构函数

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数 : 用户没有显式实现,编译器会生成的成员函数称为默认成员函数 。 这篇文章介绍的是 构造函数 和 析构函数

    2024年04月27日
    浏览(28)
  • C++入门-----析构函数

    有了构造函数用来初始化成员,那么也应该有一个函数用来清理程序运行结束时的空间。就像实现栈时的Init和Destroy一样,所以就有了析构函数。 析构函数也是特殊的成员函数。与构造函数功能相反, 析构函数不是完成对对象本身的销毁 ,局部对象销毁工作是由编译器完成

    2024年02月16日
    浏览(25)
  • C++析构函数详解

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。 析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(

    2023年04月08日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包