C++学习基础十——子类构造函数与析构函数的执行

1.子类构造函数的执行:

先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数。

当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关。

2.子类析构函数的执行:

先执行自身析构函数,再执行成员对象的析构函数,最后执行父类的析构函数 。

当继承多个类时,父类析构函数的执行过程与构造函数的执行过程相反

3.代码如下:

  1 #include <iostream>
  2 #include <string>
  3
  4 using namespace std;
  5 //子类构造函数的执行过程:先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数
  6 //当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关
  7 //子类析构函数的执行过程:先执行自身析构函数,再执行成员对象的析构函数,最后执行父类的析构函数
  8 //当继承多个类时,父类析构函数的执行过程与构造函数的执行过程相反
  9
 10 class Base1
 11 {
 12 public:
 13     Base1(int k)
 14     {
 15         a = k;
 16         cout<<"Base1的构造函数被调用...."<<endl;
 17     }
 18     void test()
 19     {
 20         cout<<a<<endl;
 21     }
 22     ~Base1()
 23     {
 24         cout<<"Base1的析构函数被调用...."<<endl;
 25     }
 26 private:
 27     int a;
 28 };
 29
 30 class Base2
 31 {
 32 public :
 33     Base2(int k)
 34     {
 35         b = k;
 36         cout<<"Base2的构造函数被调用...."<<endl;
 37     }
 38     void test()
 39     {
 40         cout<<b<<endl;
 41     }
 42     ~Base2()
 43     {
 44         cout<<"Base2的析构函数被调用...."<<endl;
 45     }
 46 private:
 47     int b;
 48 };
 49
 50 class Base3
 51 {
 52 public:
 53     Base3()
 54     {
 55         c = 0;
 56         cout<<"Base3的默认构造函数被调用...."<<endl;
 57     }
 58     void test()
 59     {
 60         cout<<c<<endl;
 61     }
 62     ~Base3()
 63     {
 64         cout<<"Base3的析构函数被调用...."<<endl;
 65     }
 66 private:
 67     int c;
 68 };
 69
 70 class Demos
 71 {
 72 public:
 73     Demos(int k)
 74     {
 75         m = k;
 76         cout<<"Demos的构造函数被调用...."<<endl;
 77     }
 78     int getM()
 79     {
 80         return m;
 81     }
 82     ~Demos()
 83     {
 84         cout<<"Demos的析构函数被调用...."<<endl;
 85     }
 86 private:
 87     int m;
 88 };
 89
 90 class son:public Base1,public Base3,public Base2
 91 {
 92 public:
 93     son(int a,int b,int c,int l);
 94     void test();
 95     ~son();
 96 private:
 97     int s;
 98     Demos d;
 99 };
100
101 son::son(int a,int b,int c,int l):Base1(a),Base2(b),s(c),d(l)
102 {
103     cout<<"son的构造函数被调用...."<<endl;
104 }
105
106 void son::test()
107 {
108     Base1::test();
109     Base2::test();
110     Base3::test();
111     cout<<s<<endl;
112     cout<<d.getM()<<endl;
113 }
114 son::~son()
115 {
116     cout<<"son的析构函数被调用...."<<endl;
117 }
118
119 int main()
120 {
121     cout<<"======子类构造函数的执行过程    start====="<<endl;
122     son son(1,2,3,4);
123     cout<<"======子类构造函数的执行过程    end====="<<endl;
124     son.test();
125
126     cout<<"\n======子类析构函数的执行过程   ====="<<endl;
127     return 0;
128 }

执行结果如下图所示:

时间: 2024-09-30 14:09:02

C++学习基础十——子类构造函数与析构函数的执行的相关文章

C++学习基础十——子类对象向父类对象的转化

一.C++中可以实现子类向父类的转换,主要分为三种形式: 1.对象转换:不能实现动态绑定,即不能实现多态. 2.引用转换:动态绑定,实现多态. 3.指针转换:动态绑定,实现多态. 注意:一般不会出现父类转化为子类的情况. 二.代码片段如下: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Item_base 7 { 8 public: 9 Item_base(const str

C++学习基础十二——纯虚函数与抽象类

一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个类中含有虚函数,则必须将该类的析构函数声明为虚函数. 4.虚函数与纯虚函数的声明: virtual void draw();//虚函数 virtual void draw() = 0;//纯虚函数 5.C++中支持两种多态性: 编译时多态:通过重载函数实现. 运行时多态:通过虚函数实现. 二.Jav

C++学习基础六——复制构造函数和赋值操作符

1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用. 作用与复制构造函数相同. 其声明如下: 1 Sales_item& operator=(const Sales_item& rig); 3.什么情况下需要我们自己实现复制构造函数和赋值操作符? 一般情况下,C++

西门子PLC学习笔记十四-(用户程序结构及执行)

PLC用户程序的总体结构如下图: 1.组织块(OB):操作系统与用户程序的接口,决定用户程序的结构. 组织块是由操作系统调用的,用于控制扫描循环和中断程序的执行,PLC的启动和错误处理,不同的CPU可以使用的组织块不都一致. 常用OB块和其对应的优先级 上表中的OB1是循环扫描的主程序,其优先级最低.处理OB90不能中断OB1的执行外,其余的OB块均可以.OB100~OB102为启动组织块,分别代表CPU的三种启动方式,即暖启动.热启动.冷启动.OB100为暖启动组织块.OB101为热启动组织块

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

第十六周oj刷题——Problem E: B 构造函数和析构函数

Description 在建立类对象时系统自动该类的构造函数完成对象的初始化工作, 当类对象生命周期结束时,系统在释放对象空间之前自动调用析构函数. 此题要求: 根据主程序(main函数)和程序执行结果,结合构造函数和析构函数相关知识,在下面的程序段基础上完成整个设计. 提示:(1)需要自定义复数类Complex,并在类中添加适当的构造函数和析构函数. (2)只提交begin到end部分的代码 Input 一个复数的实部和虚部 Output 调用相关构造函数和析构函数的运行结果(需要自己分析),

javascript基础学习(十)

javascript之数组 学习要点: 数组的介绍 定义数组 数组元素 数组的方法 一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组的构造函数来定义数组: var arr=new Array(); var arr=new Array(size); var arr=new Array(element1,element2,...); 2.直接定义数组: var arr=["字符串",true,13]; ps: 和Objec

[ Java学习基础 ] Java构造函数

构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只能与new运算符结合使用. 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int width; 9 // 矩形高度 10 int hei

javascript基础学习(十五)

javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的secure 一.cookie介绍 cookie实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上.在javascript中,cookie主要用来保存状态,或用于识别身份. 二.创建与获取cookie 创建cookie的语法代码如下所示:document.cookie="name=value&q