C++类继承时构造函数与析构函数的执行顺序


在C++类中,类A继承类B时,如果创建一个A的对象时,会首先调用基类的构造函数,再调用派生类的构造函数,而析构函数的执行相反,但是当基类和派生类分别有一个成员对象时,构造函数与析构函数的执行顺序又是怎样的呢?

基类有成员对象

说明:三个类分别为Base,Son和Temp,类图如下所示:

代码示例:

#include <iostream>using std::cout;
using std::endl;class Temp { // 成员类
public:Temp() {cout << "Temp类的构造函数执行~" << endl;}~Temp() {cout << "Temp类的析构函数执行~" << endl;}
};
class Base { //基类
private:Temp temp;
public:Base() {cout << "Base类的构造函数执行~" << endl;}~Base() {cout << "Base类的析构函数执行~" << endl;}
};
class Son : public Base { // 派生类
public:Son() {cout << "Son类的构造函数执行~" << endl;}~Son() {cout << "Son类的析构函数执行~" << endl;}
};int main() {Son son;return 0;
}

执行结果如图所示:

结论:

构造函数的执行顺序:先调用基类成员对象的构造函数,再调用基类的构造函数,最后调用派生类的构造函数;析构函数调用顺序相反。

派生类有成员函数

类图如下:

测试代码:

#include <iostream>using std::cout;
using std::endl;class Temp {public:Temp() {cout << "Temp类的构造函数执行~" << endl;}~Temp() {cout << "Temp类的析构函数执行~" << endl;}
};
class Base {public:Base() {cout << "Base类的构造函数执行~" << endl;}~Base() {cout << "Base类的析构函数执行~" << endl;}
};
class Son : public Base {private:Temp temp;
public:Son() {cout << "Son类的构造函数执行~" << endl;}~Son() {cout << "Son类的析构函数执行~" << endl;}
};int main() {Son son;return 0;
}

执行结果:

结论:

构造函数的执行顺序:先调用基类的构造函数,再调用派生类成员对象的构造函数,最后调用派生类的构造函数;析构函数调用顺序相反。

C++类继承时构造函数与析构函数的执行顺序相关推荐

  1. 实验3.1 定义一个CPU类,观察构造函数和析构函数的调用顺序

    题目 定义一个CPU类,包含等级(rank).频率(frequency).电压(voltage)等属性,有两个公有成员函数run.stop.其中,rank为枚举类型CPU_Rank,定义为enum C ...

  2. 【C++】继承时构造函数和析构函数

    1. 顺序 先调用基类的构造函数,再调用派生类构造函数.析构顺序相反. 2. 构造函数 派生类 不用初始化列表调用基类构造函数->调用基类的默认构造函数 派生类 使用初始化列表调用基类带参构造函 ...

  3. 派生类构造函数和析构函数的执行顺序

    派生类继承了基类的成员,实现了代码的重复利用,但基类的构造函数和析构函数不能被继承.如果在派生类中需要对新增加的成员进行初始化,则需要加入派生类的构造函数.同样派生类也需要添加析构函数来实现一些结束工 ...

  4. 多重继承的构造函数和析构函数的执行顺序(包含虚基类)

    下面示例就是说明多重继承析构函数和构造函数的执行顺序: #include <iostream> using namespace std;class A {public:A(int i){c ...

  5. 一文读懂C#中的抽象类、抽象方法、virtual虚函数、override重写函数及父类子类构造函数和析构函数的执行顺序

    // 父类 class People {public People(){Console.WriteLine("执行People构造函数!");}public virtual voi ...

  6. C++类引用中的构造函数与析构函数的执行顺序练习

    引用的类比被引用的类后构造,先析构 #include <iostream> #include <string>using namespace std;class Phone { ...

  7. c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序

    1.继承的概念 2.继承中,构造函数和析构函数的先后顺序

  8. 多继承的构造函数和析构函数

    //程序2:多继承的构造函数 与 析构函数 #include<iostream> using namespace std;class A { public: A() { cout<& ...

  9. Java继承时构造函数的关系

    Java继承时构造函数的关系,先来一道笔试题给大家看看: 在继承中,关于构造方法的说明,下列说法错误的是() A.子类无条件的继承父类的无参构造方法, B.子类可以引用父类中的有参构造方法,使用sup ...

最新文章

  1. 【计算机网络】应用层 : 网络应用模型 ( 应用层概述 | 客户端 / 服务器 模型 | P2P 模型 )
  2. 寻找数组中最小的k个数(快排和堆排)
  3. 使用.udl快速测试与数据库的连接并得到连接字符串
  4. 【C++、Matlab】VS2013 C++读写.mat文件
  5. Delphi XE7 用indy开发微信公众平台(3)- 验证消息真实性
  6. python set() 和 dict()
  7. Nginx 基于nginx-sticky-module模块进行会话保持
  8. 如何判断一个女孩是不是真的爱你?
  9. 计算机电子电路原理图,经典六款电路图集锦(图文)
  10. 慧编程python硬件_什么是慧编程?慧编程介绍
  11. thrift文件服务器,Thrift功能和使用
  12. prop()方法的应用
  13. python开发的著名游戏制作人是_Python 曾经开发过哪些了不起的程序或游戏?
  14. airsim-使用Image api保存机载摄像机的图片
  15. 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真
  16. 小学-知识与能力【10】
  17. 搭建DNF台服之服务器篇
  18. Retrofit网络请求数据的使用
  19. MapReduce中文翻译
  20. 计算机发展史的pdf文档,计算机的发展历程.pdf

热门文章

  1. 从孔子的“名不正则言不顺”,看公司治理体系建立的循序渐进过程
  2. 如何查大学计算机考证成绩查询
  3. 【机组】--总线-例题
  4. 报错:com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;
  5. 网页文档幅制方法【网页文字如何免费复制】
  6. workbench mesh学习笔记1
  7. 用户登录根据角色跳转至不同页面
  8. 高端设计公司的意象创意
  9. 大模型,化繁为简归文心
  10. python数据分析微信_Python微信好友数据分析