c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

在继承关系中,虚函数、虚析构函数、虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理:

虚函数:函数重写时的要求编译器动态绑定来实现多多态 ;

虚析构函数:当基类指针指向在堆内实现的派生类的动态对象时,virtaul声明的基类析构函数是告诉编译器,还要调用派生类的析构函数。

虚基类:当派生类有多重继承和多继承时,在继承链上有两个子类继承自同一基类时,此两个子类作为基类再次派生出一个类,若只想保存这两个子类的基类的一个实例,需用virtual来声明继承关系,编译器对虚基类只实现一个实例,从而避免二义性。

1 虚函数

面向对象的在继承时要实现动态多态,需要用关键字virtual告诉编译器,由编译器在编译时生成一个虚函数表,程序运行时实现每个对象通过一个自动添加的函数指针来动态绑定一个函数去实现多态:

#includeclass CShape{public:virtual double Area(){cout<Area()<Area()<

2 虚析构函数

在实现多态时,如果是由基类指针指向在堆上动态创建派生对象时,如果delete此虚类指针,则基类的析构函数被调用,并不会调用派生类的析构函数,如果派生类中有在堆上动态创建的数据时,则会出现内存泄露。C++编译器的做法时,如果基类的析构函数前面有用virtual修饰,编译器会自动去调用派生类的析构函数(实现动态绑定,如果其它成员函数的动态绑定一样),做内存释放的工作。

如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。

虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并动态调用派生类的析构函数。

#include using namespace std;class CSon{public:~CSon(){cout<

3 虚基类

当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。

如果将这种多继承和多重继承画成图形关系,会有菱形的图案出现,称为菱形继承:

e8e90c6d2b7130e729d7074858a97a28.png

如图,子类D最后会接受分别来自B和C的同一个或多个相同拷贝,从而产生了多个拷贝,即不止一次的通过多个路径继承类在内存中创建了基类成员的多份拷贝。而这些是B和C从父类继承而来,所以D类该继承B还是C传下来的,还是都接受呢?这样就产生歧义(二义性),虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的(virtual限定符),就只能继承基类的一份拷贝,从而消除歧义。

#includeclass base { protected:  int a; public:  base(){ cout <

输出结果为:0123,如果省略掉其中的关键字virtual,则输出01023,可以看出,构造函数有重复调用。

-End-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海j计算机一级分值,计算机一级考试内容及分值

计算机一级考试内容有哪些&#xff0c;各题型分值是多少&#xff0c;以下是小编整理的计算机一级考试相关内容&#xff0c;供您参考与阅读。计算机一级考试内容及分值软件环境:Windows 7 操作系统,WPS Office 2012 办公软件。并在指定时间内,完成下列各项操作:(1) 选择题(计算机…

启动之后自己关闭_电脑一开都是广告,请问怎么永久关闭?

电脑一开机&#xff0c;主屏广告、右下角弹窗广告蹭蹭蹭的弹个不停&#xff0c;相信很多人都有这样的困扰&#xff0c;尤其是在公共电脑上&#xff0c;广告多的要命。你是否有这样的经历&#xff0c;上学的时候&#xff0c;教室前面的用来讲课的电脑&#xff0c;在老师用PPT授课…

5错误怎么办_“选择不对,一生白费”:如果选错了,该怎么办?记住这两句话...

上帝把1、2、3、4、5、6、7、8、9、0十个数字摆出来&#xff0c;让面前10个人去取&#xff0c;并说道&#xff1a;“一人只能取一个。”人们争先恐后地拥上去&#xff0c;把9、8、7、6、5、4、3都抢走了。取到2和1的人&#xff0c;都说自己运气不好&#xff0c;得到的很少很少。…

北京大学灵异事件计算机房,北大 清华高校 发生的真实恐怖灵异事件

北京大学我有一高中同学b&#xff0c;大学在交大上的&#xff0c;有段时间没联系了&#xff0c;偶然的机会在街上遇到他&#xff0c;当时我被他吓了一跳&#xff0c;只见他脸色发青&#xff0c;眼窝深陷&#xff0c;一问之下&#xff0c;他神情紧张地告诉我&#xff1a;他遇到鬼…

python苹果电脑如何下载_python for Mac|python Mac版V2.7.10下载(暂未上线)_预约_飞翔下载...

pythonfor mac是一种即译式的&#xff0c;互动的&#xff0c;面向对象的编程语言&#xff0c;它包含了模组式的操作&#xff0c;异常处理&#xff0c;动态资料形态&#xff0c;十分高层次的动态资料结构&#xff0c;以及类别的使用。如果因为网络原因&#xff0c;去 Python 官网…

mysql 设置字段自动增长值_mysql命令行脚本

命令行连接在工作中主要使用命令操作方式&#xff0c;要求熟练编写打开终端&#xff0c;运行命令mysql -uroot -p回车后输入密码&#xff0c;当前设置的密码为mysql连接成功后如下图退出登录quit 和 exit或ctrld登录成功后&#xff0c;输入如下命令查看效果查看版本&#xff1a…

python显示表格_在Python中获取Excel表格的数量

How get number of sheet in below python example? file self.excel_file.decode(base64) excel_fileobj TemporaryFile(wb) excel_fileobj.write(file) excel_fileobj.seek(0) workbook openpyxl.load_workbook(excel_fileobj, data_onlyTrue) sheet_number ??? sheet…

asp网站本地测试服务器,小旋风asp服务器,asp本地环境调试必备

学习asp&#xff0c;要在本地搭建一个asp服务器调试环境吧&#xff0c;那么必不可少的要找asp本地调试环境软件&#xff0c;超级小旋风AspWebServer是一个不错的选择。超级小旋风AspWebServer系统基于NetBox开发&#xff0c;可以跟IIS媲美的服务器。小旋风asp服务器 该软件是由…

快速傅里叶变换python_【原创】OpenCV-Python系列之傅里叶变换(三十八)

OpenCV-Python系列之傅里叶变换 傅里叶变换 我们生活在时间的世界中&#xff0c;早上7:00起来吃早饭&#xff0c;8:00去挤地铁&#xff0c;9:00开始上班。。。以时间为参照就是时域分析。 但是在频域中一切都是静止的&#xff01;可能有些人无法理解&#xff0c;我建议大家看看…

c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解

1.WMI简介WMI是英文Windows Management Instrumentation的简写&#xff0c;通过使用WMI&#xff0c;我们可以获取本地或远程服务器的性能参数和进程运行情况&#xff0c;以及大部分硬件信息&#xff0c;但前提是运行的用户要有足够的权限&#xff0c;如administrator组用户等。…

中运算符百分号作用_SQL基础知识——LIKE运算符

LIKE 作用在WHERE子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与LIKE运算符一起使用&#xff1a;&#xff05; - 百分号表示零个&#xff0c;一个或多个字符_ - 下划线表示单个字符注意&#xff1a; MS Access使用问号(?)而不是下划线(_)。 百分号和下划线也可以…

服务器点播直播系统,服务器点播直播系统

服务器点播直播系统 内容精选换一换在SAP系统中&#xff0c;除了SAP HANA节点使用裸金属服务器外&#xff0c;其他节点都使用弹性云服务器。Jump Host弹性云服务器&#xff0c;用户可通过访问该服务器后&#xff0c;再通过SSH协议跳转到SAP HANA及SAP应用节点。同时用于部署SAP…

eureka多了一个莫名其妙的服务_SpringCloud 服务注册与发现组件 Eureka

一、SpringCloud介绍微服务&#xff0c;为了更好的创建项目组织结构、更高效的项目的迭代效果、更优良的架构设计&#xff0c;就需要使用微服务的架构思想&#xff0c;来对项目进行搭建或者重构。企业碰到的第一个问题是服务如何进行拆分。根据业务边界来划分&#xff0c;拆分开…

怎么用贝塞尔工具画圆_Win10恶意软件删除工具怎么用?这个方法都舍不得分享...

Win10恶意软件删除工具怎么用&#xff1f;恶意软件删除工具相信很多朋友都会在windows更新中看到过&#xff0c;但是很多朋友确从来没有用过&#xff0c;微软每个月都会把恶意软件删除工具给更新一下&#xff0c;主要作用是用来分析用户电脑上是否存在风险程序的工具。其实大家…

springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)

SpringBoot自动配置condition-1Condition是Spring4.0后引入的条件化配置接口&#xff0c;通过实现Condition接口可以完成有条件的加载相应的BeanConditional要配和Condition的实现类(ClassCondition)进行使用ClassConditionpublic class ClassCondition implements Condition {…

golang延时_golang 实现延迟消息原理与方法

实现延迟消息具体思路我是看的下面这篇文章https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ实现延迟消息最主要的两个结构&#xff1a;环形队列&#xff1a;通过golang中的数组实现&#xff0c;分成3600个slot。任务集合&#xff1a;通过map[key]*Task&#xff0c;每个slot…

python特征工程插件_手把手教你用Python实现自动特征工程

任何参与过机器学习比赛的人&#xff0c;都能深深体会特征工程在构建机器学习模型中的重要性&#xff0c;它决定了你在比赛排行榜中的位置。 特征工程具有强大的潜力&#xff0c;但是手动操作是个缓慢且艰巨的过程。Prateek Joshi&#xff0c;是一名数据科学家&#xff0c;花了…

2020笔记本性价比之王_笔记本电脑性价比排行2020前十名?

展开全部1、 联想(Lenovo)拯救者R7000产品材质&#xff1a;32313133353236313431303231363533e58685e5aeb931333433656631ABCD面塑料产品尺寸&#xff1a;15.6寸CPU型号&#xff1a; AMD Ryzen5 4600H显卡型号&#xff1a;NVIDIA GeForce GTX 1650屏幕参数&#xff1a; 1080P I…

ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...

3月10日消息&#xff0c;王者荣耀在更新正式服后&#xff0c;安卓版和iOS版开通了资料互看。此前安卓和iOS上的游戏一直因为使用的服务器不同&#xff0c;不能实现两个平台的游戏互动&#xff0c;当然也不能实现同账号的资料同步。这对很多玩家来说造成一定的困扰&#xff0c;如…

存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

FinDOM-XSSFinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具&#xff0c;广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞。工具安装广大研究人员可以使用下列命令将该项目源码克隆至本地&#xff1a;$ git clone https://github.com/dwisis…