【C++课程学习】:继承:默认成员函数

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

构造函数

🍩默认构造函数(这里指的是编译器生成的构造函数):

🍩显式写构造函数: 

拷贝构造函数:

🍩编译器自己生成的拷贝构造:

🍩显式写拷贝构造函数:

赋值重载:

析构函数:

🍩析构函数名称变化

🍩父类和子类的析构顺序

继承和友元:

继承和静态成员:

菱形继承:

继承的总结和反思:


构造函数

子类的构造函数在初始化列表时,我们发现父类的声明在子类之前。所以不管在初始化列表怎么写,都是先初始化父类,再调子类的构造。

🍩默认构造函数(这里指的是编译器生成的构造函数):

首先来看看,如果我们在子类中不显式写构造函数,看看编译器生成的默认构造会干什么事情(环境:VS2022):

我们可以把子类的成员分成三类:

1.父类的成员。(看成整体)

2.子类的内置类型。

3.子类的自定义类型。

从VS2022中可以看出,如果不写字类的默认构造函数,那么编译器生成的默认构造函数做了:

1.调用父类的构造函数,对父类成员进行初始化。

2.内置类型不做处理。(有些环境可能会初始化为0)。

3.子类的自定义类型,调用它的构造函数。(有缺省值,进行有参的构造函数)。


🍩显式写构造函数: 

我们在显示写构造函数时,一定要去调用父类的构造函数,构造函数调用的规则如下:
想调用哪个构造函数就传什么参数,根据不同的参数,可以调用不同的构造函数。

class person {    

public:
    person()        //无参的构造函数
    {
        cout << "person()" << endl;
    }
    person(int age,string name)        //传age,和name的构造函数
        :_age(age)
        ,_name(name)
    {
        cout << "person(int age,string name)" << endl;
    }
protected:
    int _age;
    string _name;
};

	student(int num):person()    //父类构造函数的调用,_num(num){}


当我们显式写子类的构造函数时,但是又没有调用父类的构造函数,编译器会帮我们怎么处理?

如果我们没有调用构造函数,那么编译器会去调用父类默认构造函数(无参的构造函数)。


但是会有一个问题?,如果父类没有无参的构造函数怎么办?

此时,由于子类写构造函数时,没有调用父类的构造函数。让编译器去调用父类的无参的构造函数。结果父类还没有无参的构造函数,编译器就会报错。

解决办法就是:在子类构造函数的初始化列表中调用父类带参的构造函数。

全缺省的可以不传参,所以也可以调到。

另外写person()=default;

可以让编译器强制生成默认构造函数。

拷贝构造函数:

🍩编译器自己生成的拷贝构造:

1.对于子定义类型,调用它的拷贝构造。

2.对于内置类型,进行值拷贝。

3.对于父类,调用父类的拷贝构造。

🍩显式写拷贝构造函数:

当我们显式写拷贝构造时,我们就需要注意要去显示调用父类的拷贝构造。

当我们显式写了拷贝构造,却又没有在初始化列表调用父类的拷贝构造,编译器不会帮我们调用父类的拷贝构造,因为父类的拷贝构造是带参的。

像下面一样,如果我们要显式调用person的拷贝构造,我们要怎么给person的拷贝构造传参呢?

传过来的是student类型的对象st,怎么变成person呢?

父类和子类有这样的特点:(赋值兼容转换

子类对象可以赋值给父类的对象,父类的指针,父类的引用。

解决办法:直接传student类型的对象st就可以了。

    //父类拷贝构造person(const person& p):_age(p._age),_name(p._name){cout << "person(person & p)" << endl;}//子类拷贝构造student(const student& st):person(st),_num(st._num){}

赋值重载:

先来看看下面这种写法的赋值运算符重载可行不?

答案是不行的,此时父类的operator=和子类operator=构成隐藏,它会去调用子类的operator=。

然后就会进入死循环

解决办法:在operator=前面指定父类的作用域。

person::operator=(st);

	//父类(基类)的赋值重载person& operator=(person& p){if (&p != this){_age = p._age;_name = p._name;}return *this;}//子类(派生类)的赋值重载student& operator=(student& st){if (this != &st){operator=(st);_num = st._num;}return *this;}

析构函数:

🍩析构函数名称变化

由于析构函数的名称最后都会被处理成destruct,所以父类的析构和子类的析构是构成隐藏关系的。要想调用父类的析构函数,必须指定在父类的作用域。

🍩父类和子类的析构顺序

必须保证先析构子类,再析构父类。

由于在构造函数中,初始化列表是按照声明的顺序进行,父类的声明在子类的前面,所以可以保证父类先初始化,子类后初始化。所以构造函数可以只调用子类构造函数。

但是在析构中,编译器会在子类对象声明周期结束时,先调用子类析构,然后再调用父类析构。

	~person(){cout << "~person()" << endl;}	~student(){cout << "~student()" << endl;}

继承和友元:

友元关系不能继承,父类的友元不能访问子类的私有成员。父亲的朋友不一定是我的朋友。

继承和静态成员:

如果父类定义了静态成员,那么在整个继承体系中,就只有这样一个成员,不管派生出多少个子类,都只有一个。

菱形继承:

单继承:一个子类只有一个直接父类时称这个继承关系为单继承。

多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。

菱形继承 菱形继承是多继承的一种特殊情况。

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。
在Assistant的对象中Person成员会有两份。
虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和
Teacher的继承Person时使用虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地
方去使用。

继承的总结和反思:

1.在实际中,一定不要设计出菱形继承。

2.类复用的方式有继承组合两冲方式。

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。

组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。

优先使用组合,再是继承。

3.继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称
为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的
内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很
大的影响。派生类和基类间的依赖关系很强,耦合度高。


4.对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象
来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复
用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。
组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被
封装。


5.实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有
些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用
继承,可以用组合,就用组合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泷羽sec学习打卡-Linux基础2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base2 一、Linux-Base2linux有哪些目录呢&#xff1f;不同目录下有哪些具体的文件呢…

TCP拥塞控制

TCP拥塞控制&#xff08;Congestion Control&#xff09; 什么是拥塞控制&#xff1f; 拥塞控制(Congestion Control)主要针对整个网络中的数据传输速率进行调节&#xff0c;防止过多的数据注入网络中&#xff0c;这样可以使网络中的路由器或链路不致于过载&#xff0c;以避免…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

自动驾驶合集(更新中)

文章目录 车辆模型控制路径规划 车辆模型 车辆模型基础合集 控制 控制合集 路径规划 规划合集

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景&#xff1a;一般用于分发配置文件时候&#xff0c;如果配置文件有变化&#xff0c;则重启服务&#xff0c;如果没有变化&#xff0c;则不重启服务 案列01&#xff1a;分发nfs配置文件&#xff0c;若文件发生改变则重启服务 2.when判断 用于给ans运…

整理5个优秀的微信小程序开源项目

​ 一、Bee GitHub: https://github.com/woniudiancang/bee Bee是一个餐饮点餐商城微信小程序&#xff0c;是针对餐饮行业推出的一套完整的餐饮解决方案&#xff0c;实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能&#xff0c;完美的使餐饮行业更高效便捷&#x…

微服务链路追踪skywalking安装

‌SkyWalking是一个开源的分布式追踪系统&#xff0c;主要用于监控和分析微服务架构下的应用性能。‌ 它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案&#xff0c;特别适用于微服务、云原生架构和基于容器的环境&#xff08;如Docker、K8s、Mesos&…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议&#xff0c;2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下&#xff0c;ITU-R WP 5D#35e远程会议宣布3GPP 5G技术&#xff08;含NB-IoT&#xff09;满足IMT-2020 5G技…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点&#xff0c;对其进行数学建模并进行MATLAB求解&#xff0c;以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度&#xff0c;将它放在18摄氏度的水池中&#xff0c;五分钟后鸡蛋的温度为38摄氏度&#x…

开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究

摘要&#xff1a;本文以企业和个人品牌发展中至关重要的用户留存问题为切入点&#xff0c;结合管理大师彼得德鲁克对于企业兴旺发达的观点&#xff0c;阐述了用户留存对品牌营收的关键意义。在此基础上&#xff0c;深入分析开源 2 1 链动模式、AI 智能名片、S2B2C 商城小程序在…

搭建Python2和Python3虚拟环境

搭建Python3虚拟环境 1. 更新pip2. 搭建Python3虚拟环境第一步&#xff1a;安装python虚拟化工具第二步&#xff1a; 创建虚拟环境 3. 搭建Python2虚拟环境第一步&#xff1a;安装虚拟环境模块第二步&#xff1a;创建虚拟环境 4. workon命令管理虚拟机第一步&#xff1a;安装扩…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景&#xff0c;需要用户真实的身份信息。 …

基于卷积神经网络的车辆损坏部位检测系统带gui

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

CHI atomics 传输——CHI(6)

原子事务&#xff0c;指的是此事务就像原子一样是不可分割的&#xff0c;要么所有操作全部完成&#xff0c;要么全部不执行&#xff0c;不存在执行部分操作的情况。 ALU (Arithmetic Logic Unit) 算术逻辑单元&#xff0c;ALU在HN或SN AddrData&#xff1a;当前memory中的数据…

批量从Excel某一列中找到符合要求的值并提取其对应数据

本文介绍在Excel中&#xff0c;从某一列数据中找到与已知数据对应的字段&#xff0c;并提取这个字段对应数值的方法。 首先&#xff0c;来明确一下我们的需求。现在已知一个Excel数据&#xff0c;假设其中W列包含了上海市全部社区的名称&#xff0c;而其后的Y列则是这些社区对应…

有趣的Midjourney作品赏析(附提示词)

中文提示词&#xff1a;国风少年 C4D软件,高分辨率,超细节,超现实主义, 英文提示词&#xff1a;National Style Youth Cinema4D,high resolution,hyper detailed,surrealism, --niji 6 --ar 1:1 中文提示词&#xff1a;粘土模型&#xff0c;男性穿着中世纪欧洲蓝色盔甲&#x…

SpringBootCloud 服务注册中心Nacos对服务进行管理

介绍 Nacos&#xff08;Naming and Configuration Service&#xff09;是一个开源的、动态的服务发现、配置管理和服务管理平台&#xff0c;特别适用于云原生应用和微服务架构。它可以作为服务注册中心&#xff0c;用于微服务的注册、发现、配置管理等。在微服务架构中&#x…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习&#xff0c;本科时已经学习过了&#xff0c;但是感觉还是有些概念和算法没有学懂学透&#xff0c;所以想重新系统性的学习一下&#xff0c;记录了整个学习过程&#xff0c;而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程&#xff0c;表&#xff08;a&#xff09;是路由表 R1 初始的路由表&#xff0c;表&#xff08;b&#xff09;是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表&#xff08;c&#xff09;。…

外星人入侵

学习于Python编程从入门到实践&#xff08;Eric Matthes 著&#xff09; 整体目录&#xff1a;外星人入侵文件夹是打包后的不必在意 图片和音效都是网上下载的 音效下载网站&#xff1a;Free 游戏爆击中 Sound Effects Download - Pixabay 运行效果&#xff1a;可以上下左右移…