C++类的继承

目录

什么是继承?

父类与子类对象的赋值转换

继承中的作用域问题

子类的默认成员函数问题

如何使一个类不能被继承?

父类的友元和静态成员变量

多重继承与菱形继承

继承和组合


什么是继承?

继承 (inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在
持原有类特性
的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象
程序设计的层次结构
,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,
承是类设计层次的复用。

继承类的格式:(class 子类名 : 继承方式 父类名)

如下面的形式

class Student : public Person
{}

基类,如Person 也叫做父类;派生类,如 Student 也叫子类

public为继承方式,还有 private,protected 继承,继承关系的原则就是父类在父类成员的权限和继承方式的权限中权限小的那一个!(如父类的 protected 成员在 public 继承后成了子类中的 protected 成员)

权限:public > protected > private 

子类无论怎样都不能访问父类的private。

父类与子类对象的赋值转换

class Person
{
public:
	void Print()
	{
		cout << _name << endl;
	}
protected:
	string _name; // 姓名
private:
	int _age = 18; // 年龄
};
class Student : public Person
{
protected:
	int _stunum; // 学号
};
int main()
{
	Student s;
	Person p = s;
	return 0;
}

子类可以赋值给父类,但父类不能赋值给子类!

因为子类肯定是 >= 父类的,所以子类给父类赋值是将子类中属于父类的那一部分拷贝过去。

上面的框中的代码也没有报错,原因是:C++中有个特殊规则,子类对象赋值给父类对象/父类指针/父类引用 的时候不会产生临时对象(父子类赋值兼容规则),所以上面的代码不用加 const 也可以通过运行。

继承中的作用域问题

1. 在继承体系中基类和派生类都有独立的作用域。(子类和父类有不同的作用域)
2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏(与参数和返回值无关)
4. 注意在实际中在继承体系里面最好不要定义同名的成员!

子类的默认成员函数问题

子类的构造函数在调用之前,会先去调用父类的构造函数

当父类中没有默认构造的时候(即自己写了构造函数或拷贝构造),必须在子类的初始化列表中显示调用父类对应的构造函数。

析构函数必须先调子类的构析函数,再调用父类的构析函数。(析构函数不能先调用父类的构析,因为子类在构析时中可能还会访问父类中的某些成员)

构析函数的特殊处理:父子类的构析函数会构成隐藏

原因:由于多态原因,析构函数会被统一处理为 destructor()

如何使一个类不能被继承?

  • 1、当将一个类的构造函数设为私有后,这个类就变得无意义了
  • 2、C++11 新规定,若以 final 修饰一个类,则这个就类不能被继承了(并且继承时会强制报错)

父类的友元和静态成员变量

子类不能继承父类的友元关系(即父亲的朋友不是你的朋友)

如图,Display 是Person 的友元函数,Student 是 Person 的子类,因为它并没有继承 Display 和 Student 的友元关系,所以在Display 里不能访问 Student 里的 protected 和 private 的成员 _stuNum,即图片中的不可访问!

父类的静态成员变量和子类的关系:

子类继承了父类静态成员变量的使用权 

但将静态成员变量定义在子类中后,发现父类中也是可以使用的,所以静态成员变量在继承中是可以共享的。

多重继承与菱形继承

普通的继承叫单继承,一个子类只有一个直接父类。

多重继承:一个子类有多个直接父类。

语法格式:

class A:public B,public C,public D

多继承的关系看似没问题,但如果两个父类的直接父类是同一个类,就会导致很难处理的菱形继承

菱形继承如果不加处理会导致数据冗余和二义性问题

数据冗余:Person 类中的数据被建立了多份,比较费空间

二义性问题:

解决方法:虚拟继承

虚拟继承可以解决菱形继承的二义性和数据冗余的问题,但虚拟继承不能在其他地方使用!

语法格式:

在中间继承父类的时候加一个 virtual 即可。

虚拟继承的原理,比较复杂,在下一篇博客中解释。 

继承和组合

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象,相当于定义在类 B 中加了一个 A 类型的成员变量。

那么使用继承还是组合,可以看这篇文章 :优先使用对象组合,而不是类继承

继承:

组合:

 

组合与继承的不同:B组合了A,但在B中不能调用A的 protected 成员和 private 成员;但如果 B继承了A,则B有时候是可以调用 A 的private 成员的。所以总的来说:继承的权限更大一些 

但继承的权限较大,父类内部的细节大部分对子类透明,这就导致了一个严重的问题:高耦合,会使代码维护起来更困难【白箱复用】。组合的优先就是,另一个类的内部细节被隐藏了,耦合度较低,可维护性较高【黑箱服用】。那么,从代码的可维护性来说,组合更好。

判断到底使用继承还是组合,主要看类与类的关系到底是什么当两个类的关系既符合继承又符合组合时,优先使用组合!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过&#xff0c;如果没有&#xff0c;推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》&#xff0c;课程目录如下&#xff1a; Ubuntu22安装Vscode 下载&#xff1a;https://code.visualstudio.com/Download 安装命令&#…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

司铭宇老师:汽车销售培训-如何提升4S店获客能力

一、数据分析与客户画像 1.数据收集与分析 4S店应当充分利用现有资源&#xff0c;收集客户信息、车辆信息、消费行为等数据。通过数据清洗、整理和分析&#xff0c;挖掘客户需求、喜好和购车习惯等关键信息。此外&#xff0c;还可以通过合作伙伴、互联网渠道等途径&#xff0…

电子电器架构刷写方案——General Flash Bootloader

电子电器架构刷写方案——General Flash Bootloader 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 注&#xff1a;文章1万字左右&#xff0c;深度思考者入&#xff01;&#xff01;&#xff01; 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免…

NLP论文阅读记录 - | 使用GPT对大型文档集合进行抽象总结

文章目录 前言0、论文摘要一、Introduction二.相关工作2.1Summarization2.2 神经网络抽象概括2.2.1训练和测试数据集。2.2.2 评估。 2.3 最先进的抽象摘要器 三.本文方法3.1 查询支持3.2 文档聚类3.3主题句提取3.4 语义分块3.5 GPT 零样本总结 四 实验效果4.1数据集4.2 对比模型…

基于Python的招聘网站信息爬取与数据分析

文末获取资源&#xff0c;收藏关注不迷路 文章目录 前言一、研究背景二、研究意义三、主要使用技术四、研究内容五、核心代码六、文章目录 前言 随着社会经济的快速发展&#xff0c;人们的生活水平得到了显著提高&#xff0c;但随之而来的社会问题也越来越多。其中最为显著的…

构建一个 AI Agent 只需要三步!

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《GPTs 构建应用程序案例实现》 —1— 今晚20点直播手把手教你三步构建一个 AI Agent AI Agent 是 AGI 时代新的企业级应用形态&#xff0c;因此掌握好 AI Agent 的架构技术原理和应用开发就是每个程序员的必备…

SpaceDesk如何连接平板/PC(生产力副屏)

1、下载安装 分为安卓端和PC端&#xff0c;两个设备都需要安装对应的软件。 SpaceDesk官网 https://link.zhihu.com/?targethttp%3A//spacedesk.net/ 需要魔法上网。安装过程比较简单&#xff0c;无脑下一步即可。 我已经把安装包准备好了&#xff0c;如果不想自己找&#…

sklearn 逻辑回归Demo

逻辑回归案例 假设表示 基于上述情况&#xff0c;要使分类器的输出在[0,1]之间&#xff0c;可以采用假设表示的方法。 设 h θ ( x ) g ( θ T x ) h_θ (x)g(θ^T x) hθ​(x)g(θTx)&#xff0c; 其中 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​…

HUAWEI华为笔记本电脑MateBook D 14 2022款 i5 集显 非触屏(NbDE-WFH9)原装出厂Windows11系统21H2

链接&#xff1a;https://pan.baidu.com/s/1-tCCFwZ0RggXtbWYBVyhFg?pwdmcgv 提取码&#xff1a;mcgv 华为MageBookD14原厂WIN11系统自带所有驱动、出厂状态主题壁纸、Office办公软件、华为电脑管家、华为应用市场等预装软件程序 文件格式&#xff1a;esd/wim/swm 安装方式…

vue3项目 - 使用 pnpm 包管理器来创建项目

创建项目 npm install -g pnpm pnpm create vue 输入项目名称、包名称、选择要安装的依赖&#xff0c;最后 pnpm install pnpm format #规范格式 pnpm dev #启动项目

OLED显示原理7T1C基础分析(PWM与DC调光)

文章目录 一、7T1C设计要点分析1、先回顾一下上篇 发光过程三个阶段---复位、补偿、发光2、设计关键点一&#xff1a;复位、补偿、发光三阶段 控制信号严格分离3、基本亮度控制策略---DC调光 && PWM调光4、PWM调光频率 之 低频PWM/高频PWM---EM信号的控制细节5、功耗优…

SSH秘钥登录服务器

一、查看本机 ssh 公钥&#xff0c;生成公钥 1.通过命令窗口 a. 打开你的 git bash 窗口 b. 进入 .ssh 目录&#xff1a;cd ~/.ssh c. 找到 id_rsa.pub 文件&#xff1a;ls d. 查看公钥&#xff1a;cat id_rsa.pub 或者 vim id_rsa.pub git–查看本机 ssh 公钥&#xff0c…

机器学习之随机森林 python

随机森林是一种集成学习方法&#xff0c;它是由多个决策树组成的模型&#xff0c;其中每棵树都是随机生成的。随机深林包括两种主要类型&#xff1a;随机森林和极端随机树。 废话不说上代码 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import…

浅谈测试自动化selenium之POM模式

基于本人也是一个初学者&#xff0c;在运用POM模式的时候记录一下自己的学习笔记。 如果你是大神&#xff0c;那么可以略过&#xff0c;如果你是初学者&#xff0c;希望对你有帮助。 本文阐述了以下几个问题&#xff1a; 什么叫POM模式 为什么要用POM模式 POM模式的思想 POM模…

【Postman】以命令行形式执行Postman脚本(使用newman)

一、背景 ​ Postman的操作离不开客户端。但是在一些情况下可能无法使用客户端去进行脚本执行。比如在服务端进行接口测试。由此我们引入了Newman。Newman基于Node.js开发&#xff0c;它使您可以直接从命令行轻松运行和测试Postman测试集。它在构建时考虑了可扩展性&#xff0c…

iOS - 真机调试的新经验

文章目录 获取真机 UDIDPlease reconnect the device.iOS 开发者模式Fetching debug symbols 很久没有在真机运行 iOS 测试了&#xff0c;今天帮忙调试&#xff0c;发现很多东西都变了&#xff0c;有些东西也生疏了&#xff0c;在这里记录下。 获取真机 UDID 创建Profile 需要…

学生选课系统基础版

概念 现实生活中&#xff1a;很多的事物凑在一起 数学中的集合&#xff1a;具有共同属性的事物的总体 Java中的集合类&#xff1a;是一种工具类&#xff0c;就像是容器&#xff0c;存储任意数量的具有共同属性的对象 作用 在类的内部&#xff0c;对数据进行组织&#xff1b;…