Effective C++ 读书笔记 条款07:为多太基类声明virtual析构函数

Effective C++ 条款36:绝不重新定义继承而来的 non-virtual 函数 深入解析 Effective C++ 条款36,理解为什么不应该重新定义继承而来的 non-virtual 函数,掌握静态绑定与动态绑定的本质区别,避免面向对象设计中的常见陷阱。 阅读详情

Core List

1. 局部销毁对象问题

class Base {

    public:

            Base();

            ~Base(); // 基类包含析构函数

}

Base *ptr = getDerivedClass();

delete ptr;

注:

(1) getDerivedClass()将返回一个 derived class 的对象;

(2) 因基类存在析构函数,在 delete 操作回收空间前将调用此基类的析构函数。(派生类成分无法销毁)// 错误

(3) 若基类的析构函数为 virtual ,则 delete 调用的析构函数则为派生类的析构函数,可以释放全部内存空间。// 正确

(4) 任何 class 只要带有 virtual 函数都几乎确定应该也有一个 virtual 析构函数。


PS:delete 和 delete[] 的区别

T *ptr = new T[10];

delete ptr;

delete[] ptr;

注:

delete : 回收空间前,先调用对象的析构函数,再回收空间;对于数组对象,仅调用 ptr[0] 对象的析构函数,ptr[1],ptr[2] 等对象的析构函数不被调用

delete[] :回收空间前,调用数组中全部对象的析构函授,再回收空间

若T为基本类型,无析构函数,则 delete 和 delete[] 则无区别, 但对于类对象,则不可混淆使用。 


2. 非基类包含 virtual 函数的问题

类如果包含虚函数,则必须包含虚函数表,且对象将包含一个vptr来指向这个虚函数表,即对象大小将增加。

PS:虚函数表问题

http://blog.youkuaiyun.com/haoel/article/details/1948051/

注:

(1) 只有当 class 内含至少一个 virtual 函数, 才为它声明 virtual 析构函数


3.  virtual 析构函数和基类问题

(1) 包含 non-virtual 析构函数的类作为基类,将导致 “局部销毁”问题

(2) 使用纯虚析构函数,创建抽象类。

      a. 虽然纯虚函数一般在基类中不提供定义, 但是必须为纯虚析构函数提供定义.

      b. 因析构函数的调用过程是从最深层的派生类析构函数开始调用,直到基类的析构函数. 




基类的析构函数不加virtual引起的异常 #include <iostream> using namespace std; class Animal{ public: static int number; virtual void printCount()=0; Animal(){ ++Animal::number; } virtual ~Animal(){ //错误... 阅读详情

相关推荐

h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案

本文前大段在讲楼主是如何解决这个问题的,以及中间遇到的麻烦。赶时间的同学可以直接看最后的 最终解决方案。在讨论之前,我们先看看官方文档上的一句话:注意:在iOS系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。what? 官方直接跟我们说GG了?楼主不甘心,还是想尝试一下。借鉴之前...

weixin_39864101的博客 854

继承多个基类

<br />测试代码:<br />#include<iostream><br />using namespace std;<br />class base1{<br />protected:<br /> int m;<br />public:<br /> void show_m(){cout<<" m is "<<m<<endl;}<br />};<br />class base2{<br />protected:<br /> int n;<br />public:<br /> void show_n(){

yanghangjun的专栏 2486

CoppeiaSim(VREP)入门

vrep/CoppeliaSim关节抖动问题原因总结【Coppeliasim|轨迹规划(一)】设置机械臂的关节角时保证机械臂不散架设置机械臂的关节角时保证机械臂不散架。

weixin_50624597的博客 3227

[Effective C++]条款07:为多态基类声明virtual析构函数

当基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么通过基类指针删除对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。将上面的基类析构函数设置为虚函数后,通过基类指针删除派生类对象时,会先调用派生类的析构函数,再调用基类的析构函数,确保所有资源正确释放。通过基类指针删除派生类对象时,编译器会根据对象的动态类型(即实际指向的派生类类型)调用正确的析构函数。如果基类的析构函数不是虚函数,编译器会直接调用基类的析构函数,而不会通过虚函数表查找派生类的析构函数。③、调用基类的析构函数。

Tim_10的博客 652

AURIX-TC3xx-GTM详解六-DPLL(Digital PLL Module)-寄存器1-DPLL寄存器

主要有下图这些寄存器2、

m0_69929716的博客 438

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3414

【effective c++】条款七:为多态基类声明virtual析构函数

摘要:Effective C++条款7强调多态基类必须声明虚析构函数,以确保通过基类指针删除派生类对象时能正确调用完整析构链。核心规则是:1) 设计为多态基类时应声明虚析构函数;2) 非基类或非多态类不应使用虚析构函数以避免虚函数表开销。典型问题场景是基类指针删除派生类对象时导致派生类资源泄漏,解决方案是将基类析构函数声明为virtual。但要注意,非多态类使用虚析构函数会带来不必要的空间开销和兼容性问题。

maybe_Tian_Xia的博客 782

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解(一)查看当前 locale 设置(二)查看当前系统所有可用 locale(三)设置系统的 locale 命令介绍 locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。 通过 locale 来设置程序运行的不同语言环境,locale 由ANSI C提供支持。locale 的

liaowenxiong的博客 3万+

Effective C++之条款07:为多态基类声明virtual析构函数

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款07:为多态基类声明virtual析构函数 Declare destructors virtual in polymorphic base classes. 直接进入正题。 C++明白指出,当deriv...

HakunaMatata的博客 243

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

全网最详细教程,手把书教你使用YOLOv10训练自己的数据集和推理(附YOLOv10网络结构图)

YOLOv10,由清华大学多媒体智能组只开发,是一款亳秒级实时端到端目标检测的开源模型。该模型在保持性能不变的情况下,与YOLOv9相比,延迟减少了46%,参数减少了25%,非常适合需要快速检测物体的应用,如实时视频分析、自动驾驶和智能医疗等领域。这些改进使得YOLOv10在实时物体检测领域达到了新的技术水平。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

Effective C++ 之【条款7:为多态基类声明virtual析构函数】

虚析构函数的运作方式是,最深层派生的那个类的析构函数最先被调用,然后是其上的基类的析构函数被依次调用。C++明确指出,当derived class对象经由一个base class指针被删除,而base class带有一个non-virtual析构函数,其结果未有定义,实际执行时通常发生的是对象的derived成分没被销毁。这样Point对象也不能塞入到一个64-bit的缓存器了,C++的Point对象就不能再和其他语言(如C)的相同声明具备一样的结构了,因此也无法传递至其他语言写的函数中去了。

weixin_44387866的博客 640

Unity中实现俄罗斯方块

二:实现思路 ——创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从(0,0)点开始依次向x轴和y轴延伸,例如x最大为9,y最大为19,则创建了一个20行10列的地图 ——制作每一个形状的预制体,Shape是每一个整体形状,Block是每一块小方块,CenterPos代表这个形状的旋转中心 ——创建GameController脚本控制游戏逻辑,挂载到面板物体上。创建Block脚本控制每个形状的操作,挂载到每个形状上 ——在GameController脚本中编...

L的博客 8558

Effective C++条款07:构造/析构/赋值运算之(为多态基类声明virtual析构函数)

一、从一个例子中介绍为什么要为基类使用virtual析构函数 我们创建一个TimeKeeper基类和一些及其它的派生类作为不同的计时方法 class TimeKeeper { public: TimeKeeper() {} ~TimeKeeper() {} //非virtual的 }; //都继承与TimeKeeper class AtomicClock :public T...

董哥的黑板报 1030

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[Effective C++]条款7 virtual析构函数

说到多态, 我们应当非常了解其运行时绑定的机制, 简单来说就是我们可以在任何时候根据用户的需求将基类绑定为不同的派生类, 用相同的操作实现不同的效果, 这其中virtual函数起到了至关重要的作用, 每一个含有虚函数的类都会维护一个虚表, 以此实现基类到派生类的动态绑定.

tianmu_sama的博客 877

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Effective C++条款07:为多态基类声明virtual析构函数

一、从一个例子中介绍为什么要为基类使用virtual析构函数 我们创建一个TimeKeeper基类和一些及其它的派生类作为不同的计时方法 class TimeKeeper { public: TimeKeeper() {} ~TimeKeeper() {} //非virtual的 }; //都继承与TimeKeeper class AtomicClock :public TimeKeeper{}; clas..

www_dong的博客 277

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【读书笔记】Effective C++ 条款7:为多态基类声明 virtual 析构函数

纯虚析构函数可以且应该public:shape() {}// 声明为纯虚// 提供定义(必须在类外)shape::~shape() {} // 空实现即可完整示例public:shape() {}// 纯虚析构函数shape::~shape() {} // 必须提供定义public:int _area;// shape s;// 错误:抽象类,不能实例化// 正确:派生类可以实例化delete ps;// 正确:调用 circle 析构,然后调用 shape 析构。

m0_68617924的博客 402

Effective C++条款07:为多态基类声明virtual析构函数

显而易见,这个条款和多态的这个特性息息相关。多态的其中一个重要是通过我们在基类中的声明虚函数,子类进行重写(override)。那么在基类中,我们声明了虚函数或者纯虚函数,那么我们应该对应地就要有虚析构函数,但是往往我们会忽略这个问题,这就会导致严重的内存泄漏问题。 下面我们上代码: class base //这里的基类并没有声明虚析构函数 { public: base() { ...

Dylan的博客 295

Effective C++条款07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base calsses)

Effective C++条款07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base calsses)

CltCj的博客 418

Effective C++ T07:为多态基类声明virtual析构函数

带有多态性质base class 应该声明一个virtual 析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual 析构函数。 class 的设计不是作为base class使用,或不是为了具备多态性,就不该声明virtual 析构函数。

Ref.Ptr.的博客 386

effective C++读书笔记--【条款07:为多态基类声明virtual析构函数】

问题 base class的指针p,指向一个derived class,如果: base class带着一个non-virtual析构函数; derived class对象经由这个base class指针被删除; 这种情况一旦发生,结局就是: 其结果未有定义----实际执行时通常发生的是对象的derived成分没有被销毁 解决办法 解铃还需系铃人,作者说冤有头债有主,即然罪魁是bas...

liangll的博客 758

Effective C++ 学习笔记 条款07 为多态基类声明virtual析构函数

这是有问题的,因为C++明白指出,当derived class对象经由一个base class的指针被删除,而该base class带着一个non-virtual析构函数时,其结果未定义——实际执行时通常发生的是对象的derived成分没被销毁。它是一个空的结构体,通常用于迭代器的分类和特性判断)(条款47),它们并非被设计用来“经由base class接口处置derived class对象”,因此它们不需要virtual析构函数。每一个带有virtual函数的class都有一个相应的vtbl。

tus00000的博客 914

Effective C++读书笔记之条款07:为多态基类声明virtual析构函数。

条款7:为多态基类声明virtual析构函数。 1、在创建有层次的类时,往往要把基类的析构函数声明为虚函数。 这是因为在使用这些类时,往往是通过基类指针或者引用使用的(类的实例在堆上),如果是析构对象时,通过delete +指针,这时如果析构函数不是虚函数,将不会调用当前指针指向对象的析构函数。这是多态的原理。 实例如下: https://blog.youkuaiyun.com/Struggling_Jeff...

Struggling_Jeff的博客 255

Effective C++ 阅读心得-条款07:为多态基类声明virtual析构函数

多态中virtual关键字的应用,超适合当面经看的~

weixin_42208702的博客 131

Effective C++--条款07:为多态基类声明virtual析构函数

假设我们要设计一系列的计时器,我们先声明一个TimeKeeper基类: //一个计时器的基类 class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); //... }; class AtomicClock: public TimeKeeper {/*....*/}; //原子钟 class WaterClock:

ize 479
上一篇: Effective C++ 读书笔记——条款04:确定对象被使用前已先被初始化
下一篇: Effective C++ 读书笔记 条款16:成对使用new和delete时要采取相同形式
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值