effective C++ 读后感(七)为多态基类声明virtual析构函数

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

七、为多态基类声明virtual析构函数

当我们使用工厂设计模式时,factory函数往往返回一个基类指针,指向一个新生成的子类对象。但是,如果对这个对象执行delete,就有可能会出现问题:要是基类的析构函数不是virtual的,那么析构函数不具有多态性,子类的析构函数不会被执行,可能造成内在泄漏。

所以说,如果我们定义一个类,要将其作为基类实现多态,那么这个类的析构函数应该设定为virtual的。

不过,如果一个类不被用作多态基类,将其析构函数定为virtual的往往是个坏主意,因为声明为virtual后该类就会有一个虑函数表,由一个虑函数表指针指出,这样会占用更多的空间。一般规则是:只有当类中至少且个virtual函数,才为它声明virtual析构函数。

这也表明,我们不应该让自己编写的类继承自一个析构函数不为virtual的类。比如说string,各种STL容器。

将析构函数声明为virtual的还有一个用途:当我们希望一个类为抽象类,但又没有任何纯虚函数,这时可能将析构函数声明为纯虚函数(当然因为最终会被调用,所以不要忘了实现它)。

别再为调试发愁!STM32CubeMX+FreeRTOS下,串口printf打印的保姆级配置指南(基于STM32F429) 本文详细介绍了在STM32CubeMX和FreeRTOS环境下实现稳定串口printf打印的配置方法。通过硬件选型、基础配置、线程安全的重定向实现以及高级调试技巧,帮助开发者解决多任务环境下的串口输出问题,提升调试效率。特别适用于STM32F429开发板用户。 阅读详情

相关推荐

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1130

关于构造函数,拷贝构造函数,析构函数的调用顺序(1)

导言 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。 下面简单介绍下这三个函数。 构造函数 1.构造函数不能有返回值 2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数

不算太晚 2446

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 285

C++中虚析构函数和纯虚析构函数

可以看一下之前的博客: 1、C++纯虚函数和抽象类 2、C++继承中的构造和析构 3、C++之基类的析构函数要声明成虚函数 一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。 class Base { public: Base(){} virtual ~Bas...

杨杨子江的博客 517

EAST算法(Efficient and Accuracy Scene Text))

1.EAST模型简介 本文介绍的文本检测模型EAST,便简化了中间的过程步骤,直接实现端到端文本检测,优雅简洁,检测的准确性和速度都有了进一步的提升。如下图: 其中,(a)、(b)、(c)、(d)是几种常见的文本检测过程,典型的检测过程包括候选框提取、候选框过滤、bouding box回归、候选框合并等阶段,中间过程比较冗长。而(e)即是本文介绍的EAST模型检测过程,从上图可看出,其过程简化为只有FCN阶段(全卷积网络)、NMS阶段(非极大抑制),中间过程大大缩减,而且输出结果支持文本行、单词的多个角度

博客 9579

深入解析EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置

本文深入解析了EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置,详细介绍了六种核心控制模式(如PPM、CSP、CSV、CST)的应用场景及实战技巧。通过EtherCAT和DS402协议的高效配合,实现工业自动化中伺服电机的精准控制,提升设备性能与稳定性。

h0i1j2k3l的博客 1175

你了解c++中的关键字virtual吗?

virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。 1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值...

xbb123456rt的博客 1万+

Anaconda详细安装及使用教程(带图文)

Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。 Conda是一个开源的包、环境管理器,可以用于...

代码帮 186万+

C++ 析构函数

C++ 析构函数 我使用的继承开发环境: Visual Studio 2010 设计一个类时,如何写析构函数? 析构函数如果我们不写的话,C++ 会帮我们自动的合成一个,就是说:C++ 会自动的帮我们写一个析构函数。很多时候,自动生成的析构函数可以很好的工作,但是一些重要的事迹,就必须我们自己去写析构函数。 析构函数和构造函数是一对。构造函数用于创建对象,而析构...

weixin_30414155的博客 1694

基于FPGA的BP神经网络Verilog设计与Matlab仿真

BP(Backpropagation)神经网络是一种常见且广泛应用的神经网络类型,通过反向传播算法实现训练和学习。本文将介绍如何使用Verilog语言在FPGA上设计一个简易的BP神经网络,并使用Matlab进行仿真验证。BP神经网络由输入层、隐藏层和输出层组成。在上述Verilog代码中,我们定义了BP神经网络的输入层、隐藏层和输出层的神经元数量,并声明了相应的信号和参数。在上述Verilog代码中,我们定义了BP神经网络的输入层、隐藏层和输出层的神经元数量,并声明了相应的信号和参数。

2301_79326254的博客 560

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1021

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

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

maybe_Tian_Xia的博客 783

SAP录入总账凭证报错 公司代码未被分配给国家或用于计算程序的国家消息号 FF703

SAP系统报错FF703的解决方案:当公司代码未分配国家或未配置计税程序时,会导致增值税计算失败。处理方法:1)通过OX02检查公司代码国家字段;2)使用OBBG为国家分配计税程序(如TAXCN)。配置步骤:1)SPRO分配公司代码到国家;2)OBBG设置国家对应的计税程序。注意事项:历史数据需清理才能修改国家字段,不同账簿可配置不同计税程序。完成配置后即可正常处理含税凭证。

金牌架构师 557

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

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

Tim_10的博客 652

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

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

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

weixin_44387866的博客 640

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

董哥的黑板报 1030

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

HakunaMatata的博客 243

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

多态基类:顾名思义,是为了实现多态的基类。也就是说当一个类准备作为基类使用,且这个类中有虚函数的话,那么就应该给这个类加上虚析构函数。而非基类或者不用于多态的基类,就不要加。下面来具体分析一下: 严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的...

zpznba的博客 358

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

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

Ref.Ptr.的博客 386

【穿越Effective C++】条款7:为多态基类声明virtual析构函数——C++多态资源管理的基石

这个条款揭示了C++多态体系中最重要的规则之一:通过基类指针删除派生类对象时,如果基类没有虚析构函数,将导致资源泄漏和未定义行为。这是理解C++对象生命周期和多态设计的核心

沐怡旸的专栏 873

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

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

Dylan的博客 295

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

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

tianmu_sama的博客 878

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

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

www_dong的博客 277

Effective_C++_条款七:为多态基类声明virtual析构函数

严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的一个简单例子: class Shape { private: int color; public: virtual void print() = 0; }; ...

Likes的博客 283

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

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

weixin_42208702的博客 131

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++ 读后感(六)若不想使用编译器自动生成的函数,就该明确拒绝
下一篇: 在Unbuntu下如何安装Microsoft Silverlight
warrenfws
博客等级 码龄17年 2粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值