C++ 继承的构造与析构
继承的构造与析构
子类对象的构造
- 子类中可以定义构造函数
- 子类构造函数
- 必须对继承而来的成员进行初始化
- 直接通过
初始化列表
或者赋值的方式
进行初始 调用父类构造函数
进行初始化
- 直接通过
- 必须对继承而来的成员进行初始化
- 父类构造函数在子类中的调用方式
- 默认调用
- 适用于无参构造函数和使用默认参数的构造函数
- 显示调用
- 通过
初始化列表
进行调用 - 适用于所有父类构造函数
- 通过
- 默认调用
- 父类构造函数的调用
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
- 构造规则
- 子类对象在创建时会首先调用
父类的构造函数
- 先执行父类构造函数再执行
子类的构造函数
- 父类构造函数可以被隐式调用或者显示调用
- 子类对象在创建时会首先调用
- 对象创建时构造函数的
调用顺序
- 调用
父类
的构造函数 - 调用
成员变量
的构造函数 - 调用
类自身
的构造函数 - 口诀:
先父母
,后客人
,再自己
- 调用
举个例子:
#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++ 继承的构造与析构相关推荐
- C++继承中构造和析构顺序
C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...
- c++基础知识点(6)类的继承,构造,析构顺序,虚继承等
学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...
- 继承中构造和析构顺序
1.子类继承父类后,当创建子类对象,也会调用父类的构造函数 2.继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 #include<iostream> using name ...
- c++继承中的构造和析构
c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...
- 【C++深度剖析教程25】继承中的构造与析构
今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...
- 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 继承同名静态成员处理 ...
- c++面向对象高级编程 学习十五 组合继承关系下的构造和析构
文章目录 继承关系 组合关系 继承和组合 继承关系 构造由内而外,析构由外而内,内即是父类 组合关系 A拥有B, 构造由内而外,析构由外而内,内即是B 继承和组合 构造和析构顺序如图:
- C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式
目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...
- C++多继承构造和析构顺序
继承时构造函数和析构函数的执行顺序 单一继承:先调用父类构造函数,再调用子类的构造函数. 多重继承:调用父类构造函数的顺序是继承时的顺序(父类->爷爷类->...子类),最后调用子类构造函 ...
最新文章
- win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
- mysql sa密码是什么_忘记mysql数据库root密码
- 新入公司 问问题 ,快速了解代码的方法
- swift学习笔记-UI篇之UIImageView
- 数组排序c语言函数_C语言如何写出返回数组最大最小值之差的函数(C primer plus 10-5)...
- Leetcode题库 762.二进制表示中质数个计算置位(哈希数组 C实现)
- 基于samba实现win7与linux之间共享文件_阳仔_新浪博客
- mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)
- Linux内核分析第一周——计算机是如何工作的
- ny 2 括号配对问题
- 于无声处 启明星辰吹响工控安全号角
- expdp的常用用法
- 抖音怎么发起挑战 发起挑战怎么玩
- jQuery.closest() 函数详解
- csgo手机上看demo_CSGOdemo文件是什么 怎么去查看CSGOdemo文件
- 教你2种常用的电商高并发处理解决方案
- Android 面试指南
- python+openCV 自适应阈值分割
- CMS的全称是什么?全名是?
- UE使用(UltraEdit)
热门文章
- Python项目:用微信自动给女朋友每天一句英语问候
- 关于MD5破解这件事
- oracle 迁库 教程,Oracle整库文件迁移步骤详解教程
- linux export 生效_Linux之提高命令行的工作效率
- 中概股暴跌后的大厂员工:230万缩水至23万、和家人一起“开源节流”
- 真会省钱!苹果iPhone SE3首拆:电池、内存容量揭晓、基带属实缩水
- realme下月将推Q3s:Q系列下半年独苗 配置更强更全面
- 商用VR新时代已来临?IDC《VR产业研究白皮书》给出答案
- 全球蜂窝基带芯片厂商去年营收209亿美元,华为海思占16%
- 知名插画师描绘nova6“5G”潮乐园 十城nova6自拍互动装置即将引爆