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

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

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

首先看下面例子:

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 张三)

Qt图形界面编程入门(7)相关推荐

  1. Qt图形界面编程入门(4)

    构造函数和析构函数 构造函数是一个与类同名的特殊的公有成员函数. 创建类对象时构造函数会被调用,且只调用一次/ 构造函数无返回类型. ·  默认构造函数格式: 类名(){.......} Accoun ...

  2. 《Qt图形界面编程入门》课后习题全解

    代码地址 https://github.com/duganlx/QT 说明 以下答案并非来自官方,而是本人自己实现的,若有啥问题,欢迎讨论(^-^) 所基于的书籍为<Qt图形界面编程入门> ...

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

    Qt的历史渊源 Qt是1991年由挪威的奇趣科技(Trolltech)公司开发的跨平台C++图形用户界面(GUI)用程序开发框架,2008年,奇趣科技公司被诺基亚公可收购,Qt也因此成为诺基亚公司旗下 ...

  4. Qt图形界面编程入门(基本窗口及控件)

    基本窗口类QWidget QWidget是所有窗体部件的基类,例如对话框类,主窗体类,以及其他诸如按钮,编辑框,标签等等都是由QWidget派生得到,QWidget拥有的方法往往都可以在其他子类中使用 ...

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

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

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

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

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

    公有成员和私有成员 从访问权限上分,类的成员又分为:公有成员(public).私有成员(private)和保护成员(protected)三类. ·  公有成员用public来说明.这部分成员可以在程序 ...

  8. Qt图形界面编程入门(标签与槽机制习题分享)

    标签对象初始显示0,每次单击标签对象后,其显示内容就加1,依次变为1.2.3等. #ifndef DIALOG_H #define DIALOG_H#include <QDialog> # ...

  9. Qt图形界面编程入门(6)

    类的私有继承方式 ①基类公有成员和保护成员都作为私有成员被派生类继承,派生类自身的函数可直接访问他们,但是派生类对象则只能通过本类的公有函数间接地访问它们. ②基类的私有成员成为派生类中更加封闭的私有 ...

最新文章

  1. 前置体验,才是打动用户的神器
  2. [无排版]redis基本数据结构的应用
  3. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
  4. DCMTK:DcmElement :: calcElementLength的测试程序
  5. shell脚本中的条件测试if中的-z到-d的意思
  6. 数据科学家应该学习JavaScript吗?
  7. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)
  8. 面试热问——你在前一份工作(实习)学到什么?
  9. UI实用素材|登录和个人资料界面模板
  10. MySQL03:DML语言
  11. C# 输出流转化成输入流操作XML
  12. mysql urlencode 中文_php url中文转码的方法
  13. 刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元
  14. 编程实践(Pandas)Task08
  15. git 加速代理设置,单仓库设置代理,指定仓库设置单独代理
  16. Windows系统拦截广告弹窗
  17. 判断手机为Android还是ios
  18. 视频教程-2020年软考网络规划设计师案例分析历年真题详解软考视频教程-软考
  19. 管理学定律五:二八定律与木桶理论
  20. Abnormal Activity Detection Using Pyroelectric Infrared Sensors

热门文章

  1. MySQL 在 Mac 环境下的安装
  2. Java中数组的打印
  3. confluence启动不起来_汽车“一键启动”只用来点火?太浪费!你不知道的还有这3个功能...
  4. java垃圾回收 分代_Java分代垃圾回收策略原理详解
  5. java责任链模式审批请假_Java使用责任链模式处理学生请假问题详解
  6. java gc堆中的分区_jvm内存各个区域详解
  7. html中给div设置的属性怎么样才能拿得到_前端基础高频面试题(更新中)
  8. java的编辑框丢失焦点_java – 捕获EditText丢失焦点
  9. java内嵌excel_如何在Excel中嵌入URL中的图像?
  10. apache mysql 登陆_Apache站点,注册登陆功能的实现