Qt图形界面编程入门(7)

派生类的构造函数和析构函数

基类的构造函数和析构函数不能被继承。

在派生类中,如果派生类新增的成员进行初始化,就必须加入新的构造函数。与此同时,对所有从基类继承下来的成员的初始化工作还是由基类的构造函数完成,必须在派生类中对基类的构造函数所需要的参数进行设置。同样,对派生类对象的扫尾,清理工作也需要加入析构函数。

首先看下面例子:

class A   //默认构造函数为空
{
public:int x;
};
class B:public A   //默认构造函数为空
{
public:int y;
};

当创建B类对象b1后,对象b1可以访问下x,y这两个成员。那么是否可以认为b1实际上是下面C类的对象呢?

class C
{
public:int x,y;
};

若利用C类创建对象c1,从成员访问权限上看,对象b1和c1没有差别。但是b1的x和c1的x不同,它继承于基类。由于派生类不能继承父类的构造函数和析构函数,因此对象b1的x占据的内存区域只能通过基类的构造函数初始化。同样,销毁对象时,b1的x占据的内存也只能由基类的析构函数进行清理。而对象c1的x是由C类构造函数初始化,由C类析构函数进行清理工作的。因此b1和c1仅仅是表面相似而已。由于派生类构造过程涉及基类构造函数的调用,因此其构造函数比较复杂。

1、构造函数

派生类构造函数的一般形式为

派生类::派生类(参数总表)::基类1(参数表1),……,基类n(参数表n),内嵌对象1(对象参数表1),……,内嵌对象m(对象参数表m){

派生类新增加成员的初始化;

}

这个声明形式很复杂,应该注意以下几点:

①对于基类继承的数据成员,应采用基类构造函数初始化,并且应放在派生类构造函数的初始化列表中,不应放到构造函数体中初始化。

②参数总表包括全部基类和全部内嵌对象的所有参数,同时也包含派生类新增数据成员的初始化参数。最后一个冒号后面的基类和内嵌对象的参数全部取自前面的参数总部。

③当派生类使用基类无参数的默认构造函数初始化继承的数据成员时,初始化列表中就不存在“基类(参数表)”的初始化部分。

④当派生类中无内嵌对象或者内嵌对象使用无参数的默认构造函数时,初始化列表中就不存在“内嵌对象(参数表)”的初始化列表部分。

⑤当基类有待参数的构造函数时,派生类应当定义构造函数,提供一个将参数传递给基类的构造函数的途径

 

派生类构造函数的执行次序为:执行基类构造函数——执行内嵌对象的构造函数——执行派生类构造函数体的内容

派生类析构函数的执行次序为:执行派生类析构函数——执行内嵌对象的析构函数——执行基类析构函数

 

派生类构造函数和析构函数的执行

代码分析:

从输出结果可以清楚地看出,构造函数执行顺序为先祖先(Person 张三),后客人(Person 王五),最后自己(Employee),这里Wang是Person类只的一个对象,被派生类Emoloyee所有。

同时,从上面的输出结果中可以看出,析构函数的执行次序恰好与构造函数相反,先执行自身(Employee)的析构函数,而后是客人(Person 王五),最后祖先(Person 张三)

 

 

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

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

相关文章

Python二级笔记(11)

知识点: 1,在栈中,栈顶指针top动态反映了栈中元素的变化情况,在循环队列中,队尾指针和队头指针的动态变化决定队列的长度,在链式存储结构中.无论是循环链表还是线性链表,插入和删除元素时&…

Python二级笔记(12)

知识点: 1,机器周期的同步标准是指CPU访问存储器一次所需要的时间 2,int()函数可以将整数字符串转换成整数,也可以将浮点数转化为整数,但是不能将其他字符串转换成整数。 3,当max(函数的参数是字典时&am…

Python二级笔记(13)

知识点: 1,机器数,不管是正数还是负数,其补码的符号位取反即是偏移码。 2,循环队列是队列的一种顺序存储结构 3, break语句会跳出break所在的最内层循环; try中 的语句出错时会被捕获异常,执行except下的…

Python二级笔记(14)

知识点: 1,在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发不重复地访问到表中其他所有的结点。 单向链表只有从头指针开始,沿各结点的指针扫描链表中的所有结点。 双向链表从任何一一个结点位置出发就可以访问到表中其他所有结…

Python二级笔记(15)

知识点: 1,数据流图(DFD)的作用是支持系统功能建模 2,一个数据库可以有多个外模型(也称子模式或用户模型),但概念模型和内模式(物理模式)只能有一个。 3&a…

Linux基础(管道符、重定向、转义字符与环境变量)

1、输入输出重定向 简而言之,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也…

软件工程(数据流图例题详解)

假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下述的数据:零件编号,零件名称,订货数量,目前价格,主要供…

软件工程(数据流图的命名、用途和自动化边界)

数据流图中每个成分的命名是否恰当,直接影响数据流图的可理解性。因此,给这些成分起名字时应该仔细推敲。 命名 1.为数据流(或数据存储)命名 (1)名字应代表整个数据流(或数据存储)的内容,而不是仅仅反映它的某些成分。 (2)不要使用空洞的…

软件工程(数据字典)

数据字典 数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。 任何字典最主要的用这都是供人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。 数据流图和数据字典共…

Qt图形界面编程入门(Qt的历史、Qt安装资源链接、Qt Creator简介)

Qt的历史渊源 Qt是1991年由挪威的奇趣科技(Trolltech)公司开发的跨平台C图形用户界面(GUI)用程序开发框架,2008年,奇趣科技公司被诺基亚公可收购,Qt也因此成为诺基亚公司旗下的编程语言工具,曾称霸一时的Symbian手机操作系统就是…

Qt图形界面编程入门(创建一个简单的程序)

1,手工编码方式 利用手工编码方式建立“Hello Qt!”程序 第一步: 得到界面 2,无UI的向导方式 从图中,我们发现向导为窗口程序提供了3个基类,分别外QMainWindow、QWidget、QDialog,3个基类的区…

Linux基础(Vim编辑器与Shell命令脚本)

1、Vim文本编辑器 Vim文本编辑器有三种模式 命令模型:控制光标移动,可对文本进行复制、粘贴、删除和查找得等工作。 输入模式:正常的文本录入 末行模式:保存或退出文档,以及设置编辑环境。 在每次运行Vim编辑器时&…

Python二级笔记(16)

知识点: 1,进程调度仅负责对CPU进行分配 2,带链的队列是采用链式存储结构表示的队列。链式存储的存储单元是不连续的,因为是不连续的存储空间,所以指针将不会有规律的地连续变化。当front rear NULL时,…

Python二级笔记(17)

操作题: 1,接收用户输入的一个浮点数,输出这个浮点数的小数部分各字符的和,以10为宽度,靠右显示,,采用星号*填充。 代码: s input("请输入一个小数:") s s[::1] cs () for c in…

Python二级笔记(18,19合集操作篇)

操作题: 1,键盘输入正整数n,按要求把n输出到屏幕,格式要求:宽度为25个字符,等号字符()填充,右对齐,带千位分隔符。如果输入正整数超过25位,则按照真实长度输…

Qt图形界面编程入门(信号和槽通信机制)

信号和槽机制是Qt的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。 声明了信号的对象,当其状态改变时,信号就由该对象发送出去,而且该对象只负责发送信号,它不知道另一端是谁在…

Python二级笔记(18,19合集知识点篇)

知识点: 1,软件测试的目的是发现程序中的错误。调试是作为成功测试的后过而出现的步骤,也就是,调试是在测试发现错误之后排除错误的过程。软件调试的任务是诊断和改成程序中的错误。 2,深度等于控制的层数 3&#x…

软件工程(成本/效益分析)

一般说来,人们投资于一项事业的目的是为了在将来得到更大的好处。开发一个软件系统也是一种投资,期望将来获得更大的经济效益,经济效益通常表现为减少运行费用或增加收入。但是,投资开发新系统往往需要冒一定的风险。系统的开发成…

Linux基础(用户身份和文件权限)

用户身份与能力 Linux是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在幕后保障Linux系统安全则是一系列复杂的配置工作。 Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码即UID…

Centos 8 RHEL 8 破解root密码

https://blog.csdn.net/u014042047/article/details/107309890/