Part7 继承与派生 7.4派生类的构造和析构
1派生类的构造函数
默认情况下:基类的构造函数不被继承,派生类需要定义自己的构造函数。
C++11 规定:可用using语句继承基类构造函数。但是只能初始化从基类继承的成员。这时派生类新增成员可以通过类内初始值进行初始化。
建议:如果派生类有自己新增的成员,且需要通过构造函数初始化,则派生类要自定义构造函数。
若不继承基类的构造函数:
继承来的成员:自动调用基类构造函数进行初始化
派生类的构造函数需要给基类的构造函数传递参数。
单继承(派生类只有一个直接基类的情况)时构造函数的定义语法:
派生类名::派生类名(基类所需的形参,本类成员所需的形参):
基类名(参数表), 本类成员初始化列表
{
//其他初始化;
};
//单继承时的构造函数举例 #include<iostream> using namespace std; class B{ public:B();B(int i);~B();void print() const; private:int b; }; B::B(){b = 0;cout << "B's default constructor called." << endl; } B::B(int i){b = i;cout << "B's constructor called." << endl; } B::~B(){cout << "B's destructor called." << endl; } void B::print() const{cout << b << endl; } class C: public B{ public:C();C(int i, int j);~C();void print() const; private:int c; }; C::C(){c = 0;cout << "C's default contructor called." << endl; } C::C(int i, int j):B(i),c(j){cout << "C's constructor called." << endl; } C::~C(){cout << "C's destructor called." << endl; } void C::print() const{B::print();cout << c << endl; } int main(){C obj(5,6);obj.print();return 0; }
构造函数的执行顺序:
1 调用基类构造函数。
顺序按照它们被继承时声明的顺序(从左向右)。
2 对初始化列表中的成员进行初始化。
顺序按照它们在类中定义的顺序。
对象成员初始化时自动调用其所属类的构造函数。由初始化列表提供参数。
3 执行派生类的构造函数体中的内容。
2派生类构造函数举例
//7-4派生类构造函数举例 #include<iostream> using namespace std; class Base1{//基类1,构造函数有参数 public:Base1(int i){cout << "Constructing Base1 " << i << endl;} }; class Base2{//基类2,构造函数有参数 public:Base2(int j){cout << "Constructing Base2 " << j << endl;} }; class Base3{//基类3,构造函数无参数 public:Base3(){cout << "Constructing Base3 *" << endl; } }; class Derived: public Base2, public Base1, public Base3{ public:Derived(int a, int b, int c, int d):Base1(a), member2(d), member1(c), Base2(b){}//此处的次序与构造函数的执行次序无关 private://派生类的私有对象成员 Base1 member1;Base2 member2;Base3 member3; }; int main(){Derived obj(1,2,3,4);return 0; }
3派生类复制构造函数
派生类未定义复制构造函数的情况:
编译器会在需要时生成一个隐含的复制构造函数;
这个隐含复制构造函数,先调用基类的复制构造函数;
再为派生类新增的成员执行复制。
派生类定义了复制构造函数的情况:
一般都要为基类的复制构造函数传递参数。
复制构造函数只能接受一个参数,既用来初始化派生类定义的成员,也将被传递给基类的复制构造函数。
基类的复制构造函数形参类型是基类对象的引用,实参可以是派生类对象的引用
如: C::C(const C &c1): B(c1) {…}
4派生类的析构函数
析构函数不被继承,派生类如果需要,要自行声明析构函数。
声明方法与无继承关系时类的析构函数相同。
不需要显式地调用基类的析构函数,系统会自动隐式调用。
先执行派生类析构函数的函数体,再调用基类的析构函数。
//7-5派生类对象析构举例 #include<iostream> using namespace std; class Base1{ public:Base1(int i){cout << "Constructing Base1 " << i << endl;}~Base1(){cout << "Destructing Base1" << endl;} }; class Base2{ public:Base2(int j){cout << "Constructing Base2 " << j << endl;}~Base2(){cout << "Destructing Base2" << endl;} }; class Base3{ public:Base3(){cout << "Constructing Base3 *" << endl;}~Base3(){cout << "Destructing Base3" << endl;} }; class Derived: public Base2, public Base1, public Base3{ public:Derived(int a, int b, int c, int d):Base1(a), member2(d), member1(c), Base2(b){} private:Base1 member1;Base2 member2;Base3 member3; }; int main(){Derived obj(1,2,3,4);return 0; }
转载于:https://www.cnblogs.com/leosirius/p/8065282.html
Part7 继承与派生 7.4派生类的构造和析构相关推荐
- 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 继承同名静态成员处理 ...
- String类的构造与析构相关处理
String类原型: 1 Class String 2 { 3 Public: 4 String(const char *str); 5 String(const String &other) ...
- 【汇编 C++】类的构造与析构
目录 前言 一.类的构造函数 什么是构造函数? 构造函数的特点 构造函数的作用 二.类的析构函数 什么是析构函数? 析构函数的特点 小结 析构函数的作用 总结 结语 封面 前言 本文章将会可能会涉及到 ...
- c++基础知识点(6)类的继承,构造,析构顺序,虚继承等
学习继承之前,我们先回顾下protected(保护)成员 protected 成员的特点与作用: -对建立其所在类对象的模块来说,它与private成员的性质相同 -对于其派生类来说,它与public ...
- 转:Delphi2010新发现-类的构造和析构函数功能
Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...
- 5、继承与派生4-派生类的构造和析构函数
派生类的构造函数只负责对派生类新增的成员进行初始化,对所有从基类继承下来成员,其初始化工作还是由基类的构造函数完成.同样,对派生类对象的扫尾.清理工作也需要加入新的析构函数. 1.构造函数 构造派生类 ...
- 不同派生方式下基类成员在派生类中的可访问范围属性
不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...
- 4.定义并实现一个Person类,包含姓名(name)与编号(code)等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(showInfo)。从Person类派生出一个Student类,拥有数
package monster.zf.Test; /*** 4.* 定义并实现一个Person类,包含姓名(name)与编号(code)* 等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(s ...
- 7.20在学生类student和教师类teacher 基础上再派生出一个助教类
/*在学生类student和教师类teacher基础上 再派生出一个助教类TeachAssistant,一个助教既具有教师的特征, 又具有学生的特征,还有自己的新特征:工资(wage). 要求将助教类 ...
最新文章
- 不断的困惑:为什么我仍然使用JavaScript函数语句
- 减少模型方差的方法借鉴
- A Full Hardware Guide to Deep Learning
- IBASE and ES change pointer
- AttributeError: type object ‘Image‘ has no attribute ‘open‘
- 安卓开发——基于ViewPager的图片轮播
- webpack打包VUE项目读取外部配置文件,灵活配置域名
- Debian安装软件商店-Debian的GUI软件管理
- Python实现Pearson相关系数计算及公式化简过程
- 一次由于SQL Server BUG引起的数据库AlwaysOn主从切换故障分析处理
- MyBatis:万能Map和模糊查询(狂神)
- Python生成器与迭代器
- 浅谈char类型范围
- Hive 高级篇(调优)
- Idea创建SpringBoot搭建SSM框架项目,支持JSP页面
- “透视HTTP协议”之破冰篇个人总结
- c++使用ODBC读取EXCEL表格
- CSLA公链为NFT带来更多可能—csla超级公链到底是干啥的
- cnn识别不定长英文验证码
- Bundle Adjustment (BA) in vSLAM or SFM
热门文章
- 1.5编程基础之循环控制 23 药房管理
- mysql 4.0手工注入_手工注入——MySQL手工注入实战和分析
- Jenkins Gitee 实现持续集成CI/CD工具【免费、推荐】
- 不允许指针指向不完整的类类型_8.7 C语言动态内存分配与指向它的指针变量
- PHP笔记-所有错误统一输出404页面(详细错误日志输出,提高安全性)
- Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
- linux cpu load 详解,理解linux cpu load - 什么时候应该担心了
- docker php nginx,docker 构建nginx + php
- java ee jstl_Java EE之JSTL(下)
- linux将所有文件生成lst_10行Python代码自动清理电脑内重复文件,解放双手!