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,一经查实,立即删除!

相关文章

python计算面积折线图_Python交互图表可视化Bokeh:4. 折线图| 面积图

折线图与面积图① 单线图、多线图② 面积图、堆叠面积图1. 折线图--单线图importnumpy as npimportpandas as pdimportmatplotlib.pyplot as plt%matplotlib inlineimportwarningswarnings.filterwarnings(ignore)#不发出警告from bokeh.io importoutput_notebookoutput_notebo…

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

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

python 多个列表合并_Python对两个有序列表进行合并和排序的例子

Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1、l2&#xff0c;如何效率比较高的将2个list合并并保持有序状态&#xff0c;这里默认排序…

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

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

中等职业计算机等级考试,中等职业学校计算机等级考试题库(含答案):EXCEL

中等职业学校计算机等级考试题库(含答案)三 EXCEL20031某工作簿已设置了"打开"与"修改"两种密码&#xff0c;如果只知道其"打开"密码&#xff0c;那么______。A可打开该工作簿&#xff0c;也可以修改&#xff0c;但是不能在原文件夹下用原文件名…

python在统计专业的应用_Python统计学一数据的概括性度量详解

一、数据的概括性度量 1、统计学概括&#xff1a; 统计学是应用数学的一个分支&#xff0c;主要通过利用概率论建立数学模型&#xff0c;收集所观察系统的数据&#xff0c;进行量化的分析、总结&#xff0c;并进而进行推断和预测&#xff0c;为相关决策提供依据和参考。统计学主…

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 运算符

Python 运算符 什么是运算符&#xff1f; 本章节主要说明Python的运算符。举个简单的例子4 5 9。 例子中&#xff0c;4和5被称为操作数&#xff0c;""号为运算符。 Python语言支持以下类型的运算符: 算术运算符 比较&#xff08;关系&#xff09;运算符 赋值运算符 …

下取整函数的含义_Excel数值取整的7种方式

原标题&#xff1a;Excel数值取整的7种方式上期帮主原创&#xff1a;《高手会这样制作图表~》(在Excel数据处理过程中&#xff0c;数值取整比较常见&#xff0c;且针对不同的要求我们需要采用不同的取整函数来解决。那今天帮主就和大家分享数值取整的7种方式&#xff0c;大家收…

软件测试面试选择判断提,软件测试面试常考判断题

1.软件测试的目的是尽可能多的找出软件的缺陷。( Y)2.负载测试是验证要检验的系统的能力最高能达到什么程度。(N )3.测试人员要坚持原则&#xff0c;缺陷未修复完坚决不予通过。(N)4.自动化测试能比手工测试发现更多的缺陷(N)5. 错误猜测法基于这样一种假设&#xff0c;以前犯过…

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

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

idea pom依赖失败_IDEA中Maven依赖下载失败的完美解决方案

使用IDEA进行Maven项目开发时&#xff0c;时不时会遇到pom.xml报错的情况&#xff0c;其中很大概率是因为Maven依赖的jar包下载失败&#xff0c;找来找去也没有找到是什么问题&#xff0c;困扰了很多程序猿&#xff0c;这里给出IDEA中Maven依赖下载失败解决方案&#xff0c;给大…

南京师范大学874计算机答案,2017年南京师范大学电气与自动化工程学院874电路考研题库...

一、计算题1&#xff0e; 计算如图所示电路的输入电阻图【答案】在端口间加电压在该作用下产生电流则解方程得则输入电阻为2&#xff0e; 列写图(a )所示电路矩阵形式的节点方程(用相量)。图【答案】该电路的有向图如图(b )所示。故可写出节点——支路关联矩阵A 和支路阻抗矩阵…

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

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

ie8不发送ajax,IE8用ajax访问不能每次都刷新的问题

AJAX简介AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。AJAX 是与服务器交换数据并更新部分网页的艺术&#xff0c;在不重新加载整个页面的情况下。IE8用ajax访问不能每次都刷新的问题介…

graphic方法重写 unity_Unity Shader 深度值重建世界坐标

根据深度重建世界坐标证明世界坐标重建正确的方法首先&#xff0c;得先找到一种证明反推回世界空间位置正确的方法。这里&#xff0c;我在相机前摆放几个物体&#xff0c;尽量使之在世界坐标下的位置小于1&#xff0c;方便判定颜色如下图&#xff1a;然后将几个物体的shader换成…

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服务器 该软件是由…

基于sklearn的朴素贝叶斯_Sklearn参数详解—贝叶斯

在开始学习具体的贝叶斯参数前&#xff0c;你可以先看看&#xff1a;朴素贝叶斯详解​mp.weixin.qq.com朴素贝叶斯一共有三种方法&#xff0c;分别是高斯朴素贝叶斯、多项式分布贝叶斯、伯努利朴素贝叶斯&#xff0c;在介绍不同方法的具体参数前&#xff0c;我们先看看这三种方…