继承的构造与析构

子类对象的构造

  • 子类中可以定义构造函数
  • 子类构造函数
    • 必须对继承而来的成员进行初始化

      • 直接通过 初始化列表 或者 赋值的方式 进行初始
      • 调用父类构造函数 进行初始化
  • 父类构造函数在子类中的调用方式 
    • 默认调用

      • 适用于无参构造函数和使用默认参数的构造函数
    • 显示调用 
      • 通过 初始化列表 进行调用
      • 适用于所有父类构造函数
  • 父类构造函数的调用
class Child : public Parent
{public://隐式调用Child(){cout << "Child()" << endl;}//显示调用Child(string s) : Parent("Parameter to Parent"){cout << "Child() : " << s << endl;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

举个例子:

#include <iostream>
#include <string>using namespace std;class Parent
{
public:Parent(){cout << "Parent()" << endl;}Parent(string s){cout << "Parent(string s) : " << s << endl;}
};class Child : public Parent
{
public://这里隐式调用了父类构造Child(){cout << "Child()" << endl;}//这里再初始化列表中显示的调用了父类构造Child(string s) : Parent(s){cout << "Child(string s) : " << s << endl;}
};int main()
{       //初始化c时,调用了不带参数的父类构造//也调用了不带参数的子类构造Child c; //初始化cc时,调用了带参数的父类构造//也调用了带参数的子类构造Child cc("cc");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

运行结果如下:

Parent()
Child()
Parent(string s) : cc
Child(string s) : cc
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
  • 构造规则

    • 子类对象在创建时会首先调用父类的构造函数
    • 先执行父类构造函数再执行子类的构造函数
    • 父类构造函数可以被隐式调用或者显示调用
  • 对象创建时构造函数的调用顺序 
    1. 调用父类的构造函数
    2. 调用成员变量的构造函数
    3. 调用类自身的构造函数
    4. 口诀: 先父母后客人再自己

举个例子:

#include <iostream>
#include <string>using namespace std;class Object
{
public:Object(string s){cout << "Object(string s) : " << s << endl;}
};class Parent : public Object
{
public:Parent() : Object("Default"){cout << "Parent()" << endl;}Parent(string s) : Object(s){cout << "Parent(string s) : " << s << endl;}
};class Child : public Parent
{Object mO1;Object mO2;
public:Child() : mO1("Default 1"), mO2("Default 2"){cout << "Child()" << endl;}//这里先调用Parent(s) 父类的带参构造函数//再分别调用成员变量 m01 m02 的带参构造函数//最后调用自身的 带参构造函数Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2"){cout << "Child(string s) : " << s << endl;}
};int main()
{       Child cc("cc");return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

运行结果如下:

Object(string s) : cc
Parent(string s) : cc
Object(string s) : cc 1
Object(string s) : cc 2
Child(string s) : cc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

子类对象的析构

举个例子:

#include <iostream>
#include <string>using namespace std;class Object
{string ms;
public:Object(string s){cout << "Object(string s) : " << s << endl;ms = s;}~Object(){cout << "~Object() : " << ms << endl;}
};class Parent : public Object
{string ms;
public:Parent() : Object("Default"){cout << "Parent()" << endl;ms = "Default";}Parent(string s) : Object(s){cout << "Parent(string s) : " << s << endl;ms = s;}~Parent(){cout << "~Parent() : " << ms << endl;}
};class Child : public Parent
{Object mO1;Object mO2;string ms;
public:Child() : mO1("Default 1"), mO2("Default 2"){cout << "Child()" << endl;ms = "Default";}Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2"){cout << "Child(string s) : " << s << endl;ms = s;}~Child(){cout << "~Child() " << ms << endl;}
};int main()
{       //继承顺序为: Child->Parent->Object//然后 Child 中有两个Object成员变量Child cc("cc");cout << endl;//所以构造顺序为 先父母//1、调用Object 带参构造 调用Parent 带参构造//再客人//2、调用Object 带参构造//后自己//3、调用Child 带参构造//析构顺序正好相反 先自己//1、调用Child 析构//再客人//2、调用Object 析构//后父母//3、调用Parent Object 析构return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

执行结果如下:

Object(string s) : cc
Parent(string s) : cc
Object(string s) : cc 1
Object(string s) : cc 2
Child(string s) : cc~Child() cc
~Object() : cc 2
~Object() : cc 1
~Parent() : cc
~Object() : cc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

C++ 继承的构造与析构相关推荐

  1. C++继承中构造和析构顺序

    C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...

  2. c++基础知识点(6)类的继承,构造,析构顺序,虚继承等

    学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...

  3. 继承中构造和析构顺序

    1.子类继承父类后,当创建子类对象,也会调用父类的构造函数 2.继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 #include<iostream> using name ...

  4. c++继承中的构造和析构

    c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...

  5. 【C++深度剖析教程25】继承中的构造与析构

    今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...

  6. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...

  7. c++面向对象高级编程 学习十五 组合继承关系下的构造和析构

    文章目录 继承关系 组合关系 继承和组合 继承关系 构造由内而外,析构由外而内,内即是父类 组合关系 A拥有B, 构造由内而外,析构由外而内,内即是B 继承和组合 构造和析构顺序如图:

  8. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  9. C++多继承构造和析构顺序

    继承时构造函数和析构函数的执行顺序 单一继承:先调用父类构造函数,再调用子类的构造函数. 多重继承:调用父类构造函数的顺序是继承时的顺序(父类->爷爷类->...子类),最后调用子类构造函 ...

最新文章

  1. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
  2. mysql sa密码是什么_忘记mysql数据库root密码
  3. 新入公司 问问题 ,快速了解代码的方法
  4. swift学习笔记-UI篇之UIImageView
  5. 数组排序c语言函数_C语言如何写出返回数组最大最小值之差的函数(C primer plus 10-5)...
  6. Leetcode题库 762.二进制表示中质数个计算置位(哈希数组 C实现)
  7. 基于samba实现win7与linux之间共享文件_阳仔_新浪博客
  8. mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)
  9. Linux内核分析第一周——计算机是如何工作的
  10. ny 2 括号配对问题
  11. 于无声处 启明星辰吹响工控安全号角
  12. expdp的常用用法
  13. 抖音怎么发起挑战 发起挑战怎么玩
  14. jQuery.closest() 函数详解
  15. csgo手机上看demo_CSGOdemo文件是什么 怎么去查看CSGOdemo文件
  16. 教你2种常用的电商高并发处理解决方案
  17. Android 面试指南
  18. python+openCV 自适应阈值分割
  19. CMS的全称是什么?全名是?
  20. UE使用(UltraEdit)

热门文章

  1. Python项目:用微信自动给女朋友每天一句英语问候
  2. 关于MD5破解这件事
  3. oracle 迁库 教程,Oracle整库文件迁移步骤详解教程
  4. linux export 生效_Linux之提高命令行的工作效率
  5. 中概股暴跌后的大厂员工:230万缩水至23万、和家人一起“开源节流”
  6. 真会省钱!苹果iPhone SE3首拆:电池、内存容量揭晓、基带属实缩水
  7. realme下月将推Q3s:Q系列下半年独苗 配置更强更全面
  8. 商用VR新时代已来临?IDC《VR产业研究白皮书》给出答案
  9. 全球蜂窝基带芯片厂商去年营收209亿美元,华为海思占16%
  10. 知名插画师描绘nova6“5G”潮乐园 十城nova6自拍互动装置即将引爆