搞清楚[继承],易如反掌

穷不失义,达不离道。——孔丘《论语》


继承

  • 1、简单理解
  • 2、继承
    • 2、1、继承的概念
    • 2、2、继承定义
    • 2、3、基类和派生类对象赋值转换
    • 2、4、继承中的作用域
    • 2、5、派生类默认成员函数
    • 2、6、继承中的特点
      • 2、6、1、友元
      • 2、6、2、静态成员
      • 2、6、3、菱形继承及菱形虚拟继承
  • 3、总结

1、简单理解

封装,继承和多态是C++中不可或缺的组成部分。
封装: 数据和方法放在一起,把想给你访问的定义为公有,不想的定义为私有。就例如:一个类型放到另一个类型里面,通过typedef成员函数调整,封装另一个全新的类型。
继承: 面对对象复用的重要方式->类设计层面上的复用
继承不算是模版,对于模版来说,模版只是一个单纯的一个类,不同的类型,数据类型的不同而已,但是继承不只是类型的区别。
请看一下的图形,第一个表示的是模版的含义,而第二个是继承的含义。
在这里插入图片描述
在这里插入图片描述

多态: 通俗来说,就是多种形态,具体点就是去完成某个行为,不同对象去完成会产生不同的状态。如果想要更具体的案例,那么现实生活中到处都是,就比如买火车票,不同身份的人买的价格都会不一样,相同的人买几等座价格也是不一样的,这就是一个比较典型的多态案例。

继承和多态更细节的地方会在下面说,这里只是简单的概括一下主体。

2、继承

2、1、继承的概念

继承机制是面向对象程序设计使代码能够复用的重要手段,能够允许程序员在保持原有类的特性的基础之上就行扩展,增加内容和功能,这样产生的类成为派生类。继承展现了面对对象程序设计的层次结构,体现了由简单到复杂的认知过程。
与函数的复用相类似,继承是类设计层次的复用。

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "peter"; // 姓名int_age=18; //年龄
};
// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了 Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象,可 以看到变量的复用。调用Print可以看到成员函数的复用。
class Student : public Person
{ 
protected:int _stuid; // 学号 
};class Teacher : public Person
{protected:int _jobid; // 工号 
};
int main() 
{Student s;Teacher t;s.Print();t.Print();return 0; 
}

2、2、继承定义

在这里插入图片描述
派生类和基类的名字是根据程序员自行定义的,无所谓叫什么。
其中继承方式有三种,分别是private,protect和public。
当然继承方式和访问限定符的共同作用下才能知道成员变量或者是成员函数到底有了怎么样子的改变。
在这里插入图片描述

总结:

  1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。
  2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。 可以看出保护成员限定符是因继承才出现的。
  3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他 成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。
  4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
  5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡 使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里 面使用,实际中扩展维护性不强。

2、3、基类和派生类对象赋值转换

派生类对象 能够直接赋值给基类的对象/基类的指针/基类的引用。也能够俗称是切片或者是切割。形象的说明,在赋值的时候是派生类是将整个对象就行部分切割之后再赋值给基类,保证基类的正确性,没有多余的部分。
在这里插入图片描述

==基类对象不能赋值给派生类。==很显而易见的是基类的成员并没有多余派生类,如果赋值给派生类,一些部分显而易见的会产生问题,包括但不限于随机赋值,也指针的出现。

2、4、继承中的作用域

每一个成员都有自己的作用域,函数有函数的作用域,变量有变量的作用域,乃至main函数也有自己的作用域,所以继承中的作用域也很重要。
1、继承中的基类和派生类都有独立的作用域。
2、当子类和父类中存在同名函数时,子类成员将会屏蔽父类对同名函数的直接访问,这种情况也叫做隐蔽,也叫重定义
3、成员名相同,就构成隐蔽
4、在设计过程中继承体系最好不要定义同名的成员
这段代码中包含了函数名相同时,出现的隐蔽现象,同时也说明了如果隐蔽了该如何调用基类中的成员函数。

#include<iostream>
#include<string>
using namespace std;
class Person
{
protected:string _name = "小李子"; // 姓名int _num = 111;// 身份证号
};
class Student : public Person
{
public:void Print(){cout << " 姓名:" << _name << endl;cout << " 身份证号:" << Person::_num << endl;cout << " 学号:" << _num << endl;}
protected:int _num = 999; // 学号
};
void Test()
{Student s1;s1.Print();
};
int main()
{Test();return 0;
}

在这里插入图片描述
这样的结果也能够说明,隐蔽的效果和消除隐蔽的方法。
需要注意的是!这里是隐蔽而不是函数重载,重载和隐蔽是两码事!

2、5、派生类默认成员函数

  1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。
  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  3. 派生类的operator=必须要调用基类的operator=完成基类的复制。
  4. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  5. 派生类对象初始化先调用基类构造再调派生类构造。
  6. 派生类对象析构清理先调用派生类析构再调基类的析构。
  7. 因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲解)。那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。
    构造时,基类构造再到派生类。析构时显示派生类析构然后再是基类。

2、6、继承中的特点

2、6、1、友元

在基类的定义中可能存在友元,友元的存在在继承中又有什么样的特性呢?
首先,友元是不能够继承的 简单点意思就是你爸爸的朋友不是你的朋友。基类的友元不能够访问子类的私有和保护成员。

2、6、2、静态成员

如果在基类中定义了一个static静态成员,那么整个继承体系中只会有一个这样的成员,无论多少个子类,访问的都是同一个static成员。

2、6、3、菱形继承及菱形虚拟继承

在刚刚讲过的所有的案例中,我们的继承都是按照类似线性的关系来进行继承,但是难免在现实中存在多继承的情况出现。所以一个典型的菱形继承就值得我们来了解并且来分析其中可能存在的问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样子的菱形继承就会存在问题,导致一个数据到最后一个类的时候可能会有两个不同的值,不知道该怎么继承,所以菱形继承的问题就是在
1)数据冗余 2)二异性
虽然解决二异性的问题能够在数据前加上限定符来特指某个类中的数据,但是对于数据冗余的问题还是没有解决。
所以这个时候,就需要通过virtual,虚继承的方式来解决问题
virtual在继承过程中就需要加上,如不是最后的时候才加上。
在这里插入图片描述
从内存中能够观察到D对象内部,A,B与C到底怎么储存的,能够类似于类中的函数一样,将A中的a放在最后一个类似于公共的区域,让a只存在一个,改变修改相同的一个a。
那么其中B与C第一行中的那串地址又能代表什么呢,为什么每个的第一行都是一串奇奇怪怪的地址,这究竟是怎么做到能够找到a的地址的呢? 其实就是因为这第一行的地址,才能够让我们找到具体的位置在哪,结下来我们将这串地址放在内存中寻找一下,看看是什么。
在这里插入图片描述
也就是这个样子,找到的位置存放的位置之后可以看到存放的第二个地址的地方的数就是按照从当前位置找到公共位置的地址的距离。这样也就说得通两个地址找到A的位置并且能够得到a的值。
用专业的话来说也就是,通过B,C两个指针指向一张表,这两个表就叫虚基表,两个指针就叫虚基表指针。虚基表中存的偏移量可以找到A。

3、总结

其实继承中复杂的大多是是多继承,多继承中又存在菱形继承,有了菱形继承就又会有菱形虚拟继承,有了菱形虚拟继承底层就会变的复杂。所以一般来说都是不设计多继承,即使有着多继承,也尽量不设计菱形继承,否则在复杂度以及性能上都会存在问题。
并且大多数情况之下,继承也可以换成组合的方式来实现
都能用选组合,其他情况适合什么用什么。
继承的缺点还存在着高耦合的问题。当继承中改变了就会改变后续继承的偶有元素,这样也会造成不少的麻烦,会对后期的修改有较大部分的影响,导致牵一发而动全身的后果。

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

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

相关文章

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

【深度学习基础】MacOS PyCharm连接远程服务器

目录 一、需求描述二、建立与服务器的远程连接1. 新版Pycharm的界面有什么不同&#xff1f;2. 创建远程连接3. 建立本地项目与远程服务器项目之间的路径映射4.设置保存自动上传文件 三、设置解释器总结 写在前面&#xff0c;本人用的是Macbook Pro&#xff0c; M3 MAX处理器&am…

PointNet——源码调试(模型训练+可视化测试显示)

因为项目涉及到3D点云项目&#xff0c;故学习下PointNet这个用来处理点云的神经网络 论文的话&#xff0c;大致都看了下&#xff0c;网络结构有了一定的了解&#xff0c;本博文主要为了下载调试PointNet网络源码&#xff0c;训练和测试调通而已。 我是在Anaconda下创建一个新的…

【C++知识点总结全系列 (08)】:面向对象编程OOP

这里写目录标题 1、OOP概述(1)面向对象四大特征A.抽象B.封装C.继承D.多态 (2)构造函数A.What&#xff08;什么是构造函数&#xff09;B.Why&#xff08;构造函数的作用&#xff09;C. Which&#xff08;有哪些构造函数&#xff09; (3)析构函数A.What&#xff08;什么是析构函数…

【YOLOv8系列】(一)YOLOv8介绍:实时目标检测的最新突破

目录 引言 背景与发展历程 YOLOv8架构设计 1. 改进的特征提取网络 2. 多尺度特征融合 3. 新的激活函数 4. Attention机制 模型训练与优化 性能评估 应用案例 目标检测 图像分割 图像分类 姿势估计 旋转框检测&#xff08;OBB&#xff09; 优势与挑战 优势&…

SAP PS学习笔记03 - 批量更改Project(CNMASS),批量创建Project(CNMASSCREATE)

上一章讲了网络&#xff08;Network&#xff09;&#xff0c;活动&#xff08;Activity&#xff09;&#xff0c;PS长文本&#xff0c; PS文书&#xff08;凭证&#xff09;&#xff0c;里程碑&#xff08;Milestone&#xff09;的创建等相关知识。 SAP PS学习笔记02 - 网络&a…

中西部公关新篇章:赛氪网赋能新质生产力赛事,引领行业潮流

2024年7月7日&#xff0c;武汉光谷盛况空前&#xff0c;中西部公共关系协会共同体多边合作平台&#xff08;以下简称“共同体”&#xff09;举办了2024年度中西部公关协会会长、秘书长专题交流会&#xff0c;本次会议主题为“加快新质生产力&#xff0c;推进公关行业新格局&…

思维+数学,CF 1138B - Circus

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1138B - Circus 二、解题报告 1、思路分析 设第一组会小丑和杂技的人数分别为x1, y1 第二组会小丑和杂技的人数分别为x2, y2 显然根据要求有&#xff1a; x1 y2 > x1 x2 x2 y2 上式说明第二组每…

213.贪心算法:跳跃游戏||(力扣)

class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0; // 如果数组长度为1&#xff0c;已经在终点&#xff0c;不需要跳跃int cur 0; // 当前跳跃能到达的最远位置int flag 0; // 记录跳跃次数int next 0; // 下一次跳跃能到…

0302GPIO外设输入功能

GPIO外设输入功能 输入部分硬件电路按键简介传感器模块简介按键和传感器模块的硬件电路 C语言的学习C语言数据类型宏定义typedef结构体枚举C语言知识总结 按键控制LED灯&光敏传感器蜂鸣器GPIO总结GPIO使用方法总结模块化编程的方法&#xff1a; 两个程序&#xff1a;按键控…

PostgreSQL 里怎样解决多租户数据隔离的性能问题?

文章目录 一、多租户数据隔离的性能问题分析&#xff08;一&#xff09;大规模数据存储和查询&#xff08;二&#xff09;并发访问和锁争用&#xff08;三&#xff09;索引维护成本高&#xff08;四&#xff09;资源分配不均 二、解决方案&#xff08;一&#xff09;数据分区&a…

计算理论复习

1.Turing Machine 确定性图灵机 图灵机有很多不同的定义&#xff0c;这里选取其中一种&#xff0c;其它定义下的图灵机往往与下面这种定义的图灵机计算能力等价。 图灵机是一个在一条可双向无限延伸且被划分为若干格子的纸带上进行操作的机器&#xff0c;其有内部状态&#…

Springboot项目实训--day2

今天学习的是idea和MySQL的连接&#xff0c;以及一些基本的增删改查的功能实现。 一、软件下载 昨天下载了idea&#xff0c;今天要是西安它们的连接&#xff0c;就需要再下载MySQL&#xff0c;我的MySQL是前面几个学期别人帮忙下载的&#xff0c;所以具体的操作步骤我也不清楚…

基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

3-6 构建线性模型解决温度计示数转换问题

3-6 构建线性模型解决温度计示数转换问题 直接上源码 %matplotlib inline import numpy as np import torch torch.set_printoptions(edgeitems2, linewidth75)导入必要的库并设置 PyTorch 的打印选项&#xff0c;确保在打印张量时显示边缘项和行宽。 #%% t_c [0.5, 14.0,…

window.matchMedia

matchMedia() 返回一个新的 MediaQueryList 对象&#xff0c;表示指定的媒体查询字符串解析后的结果。 const width ref(); const myFunction (x) > {if (x.matches) {// 媒体查询document.body.style.backgroundColor "yellow";width.value "yellow&quo…

alibabacloud学习笔记11

讲解什么是配置中心及使用前后的好处 讲解Nacos作为配置中心面板介绍 官方文档 Nacos config alibaba/spring-cloud-alibaba Wiki GitHub 加入依赖&#xff1a; 订单服务和视频服务也加上这个依赖。 讲解Nacos作为配置中心实战 订单服务添加配置。 我们注释掉之前的配置。 …

乐鑫ESP-NOW与Wi-Fi SoC方案家居设备无缝连接,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;智能家居逐渐成为现代生活的一部分。ESP-NOW技术以其独特的无线通信能力&#xff0c;为智能家居领域带来了一场革命。 ESP-NOW是一种由乐鑫定义的无线通信协议&#xff0c;它能够在无需路由器的情况下&#xff0c;实现设备间的直接、快速、低功…

事务性数据系统中复制与 S3 Express One Zone 的成本分析

原文链接&#xff1a;https://jack-vanlightly.com/blog/2024/6/10/a-cost-analysis-of-replication-vs-s3-express-one-zone-in-transactional-data-systems作者&#xff5c;Jack Vanlightly AutoMQ 导读 随着 S3 在构建现代化数据基础设施的流行&#xff0c;广大 data in…

【免费的车间数据监控大屏】车间管理的新利器,让生产效率一目了然

面对生产车间里各种繁杂的数据&#xff0c;你不会还在用Excel敲击一个个无聊的数据吧&#xff1f;怎么不试试生动形象的车间数据看板呢&#xff1f; 在繁忙的车间里&#xff0c;每一寸空间都跳动着生产的脉搏&#xff0c;而车间数据监控看板&#xff0c;就像是这个舞台上的“智…