c++之旅第七弹——继承

大家好啊,这里是c++之旅第七弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一.继承和派生:(实质上是一个过程,不过是从不同角度来看的)

1.继承方式:

单继承:

class A
{};
class B:public A
{};

多继承:

class D
{};
class E
{};
class F:public D,public E
{};

多级继承:

class A
{};
class B:public A
{};
class C:public B
{};
class D:public C
{};
//多级继承,
//D 拥有了 A,B,C 的所有属性

2.继承涉及的属性问题:

(1)以上的继承动作属性都是公有,不过还有和类中成员相同的其他属性:私有和保护

继承时基类中的成员属性和继承动作的属性是一起决定派生类中的成员属性的,两者同时考虑,那个更严格派生类中该成员的属性就是哪个属性(私有>保护>公有),所以一般使用公有继承,这样可以保留原来基类中成员的原有属性不变

(2)如果基类中某一成员是私有属性,那么无论使用那种继承方式,在派生类中也是无法进行直接访问的,要访问也只能通过公有接口来进行访问,如果类B继承类A时继承方式是私有,而基类A中成员的属性为公有,那么在派生类B中是可以进行基类A中该成员的访问的,而当派生类C继承B时使用任何继承方式都无法对基类A中的该成员进行访问,这是因为B继承A时使用私有继承方式,相当于A类是B类的私有属性成员。

(3)保护属性成员可以在派生类中进行访问,但是不可以在派生类的派生类中进行访问

(4)基类如果是带参构造,在派生类通过成员初始化列表进行构造函数的调用:

class B :public A
{
    int d;
public:
    B(int i) :A(i)//基类如果是带参构造,在派生类通过成员初始化列表进行构造函数的调用
    {
        d = 3;
    }
    ~B()
    {
    }
};

3.有关继承和派生中的内存问题:

(1)派生类可以作为基类对象,基类对象不可以作为派生类对象,也就是进行赋值操作,这是因为派生类的内存是大于基类的内存的,用派生类对象来给基类对象进行赋值可以使基类对象中的内存都放满,剩余的不属于基类,放不进去也无所谓;而如果将基类赋值给派生类对象时,就会出现派生类对象的内存有空缺,无法表示派生类,所以这种赋值是无法进行的。

(2)若使用多级继承,那么最终的类类型对象的成员在内存中的表现为嵌套时最内部的类的成员是储存在最终的派生类对象中最前面的内存区域

三,继承之后:派生类可以继承父类中的所有数据成员和函数成员除了构造和析构函数,这是属于类自身的,无法进行继承

(1)继承之后派生类的构成:继承时如果基类和派生类中有同名的成员,在派生类中进行调用时优先调用派生类中的成员,局部优先于全局,如果想要调用的是基类中的成员,那么需要使用类名作用域来进行调用,因为包含一个无名的对象,无法使用对象名作用域来进行访问,使用类名作用域代替之,多继承同样可以使用类名作用域来进行成员的访问

//继承时的访问:
class CA
{
protected:
    int a;
public:
    CA()
    {
        a = 10;
    }
};
​
class CB : public CA
{
    int a;
public:
    CB()
    {
        CA::a = 123;//在CB对象里面包含一个无名的CA对象,所以只能通过类型去作用域访问
        a = 20;
    }
};

(2)在定义一个派生类对象时,其构造顺序为先构造基类对象,然后再在基类的基础上构造派生类对象,也就是调用构造函数的顺序,然后当程序运行结束时(假设是在栈区的对象)析构函数是反向来进行析构的,这和栈结构有关,但是在堆区进行以上操作时,也是遵循以上规律(构造是通过new开辟堆区内存,析构是手动使用delete来进行指针的删除)

四, 菱形继承:一个基类(共同基类)派生出两个类(间接基类),这两个类再进行多继承至一个类(最终类)

1.菱形继承虚继承时两个间接基类都要写virtual关键字,这样才能起到虚继承应该起到的作用,否则还是会进行共同基类的二次拷贝,因为写了virtual关键字才可以使间接基类拥有多的四个字节,有指针的作用,可以寻找共同基类是否已经构造过,从而避免多次拷贝

2.虚继承间接基类中多的四字节相当于是指针,可以用来寻找共同基类是否已经构造过了,若构造过就不会再次构造,这样可以减少当共同基类内存大时的没有必要的二次拷贝内存

3.尽量不写菱形继承,因为会引起一些问题,主要包括以下几点原因:

(1)虚基类冗余数据:在菱形继承中,由于共同基类被多次继承,会导致虚基类中的数据在派生类中存在多份冗余拷贝,增加了内存消耗。

(2)构造函数调用顺序不明确:在菱形继承中,由于存在多条继承路径,构造函数的调用顺序可能变得复杂,不易理解和维护。

(3)内存布局不清晰:由于存在多份冗余数据和多条继承路径,菱形继承的内存布局变得复杂,容易引起内存对齐、访问越界等问题。

(4)代码可读性差:菱形继承会增加代码的复杂性,降低代码的可读性和可维护性,使程序难以理解和调试。

如果一定要写,尽量使用虚继承方式

4.构造顺序:虚基类->基类->派生类,虚基类的无名对象是在继承的最终类对象中的最后部分的内存,且只有一份它的内存。

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

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

相关文章

夜间8点到12点能干点啥副业?

们放松和追求个人兴趣的时候,也是一段时间可以用来开展副业的机会。以下是一些适合晚上从事的副业的建议。 1.【千金宝库】软件做任务赚钱 【千金宝库】任务平台是为那些没有资源和人脉的人准备的。它非常适合那些没有时间限制、没有门槛的学生,平时玩…

以太网传输图片工程出现的问题总结(含源码)

本文对以太网传输图片的工程曾经出现过的问题及解决思路进行整理,便于日后出现类似问题能够快速处理。也指出为什么前文在FIFO IP设计时为啥强调深度的重要性。 1、问题 当工程综合完毕之后,下载到板子,连接以太网口,相关硬件如下…

0G联合创始人MICHAEL HEINRICH确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的不断发展和应用,全球开发者瞩目的Hack.Summit() 2024区块链开发者大会即将于2024年4月9日至10日在香港数码港盛大举行。此次大会由Hack VC主办,并得到AltLayer和Berachain的协办,同时汇聚了Solana、The Graph、Blockchain Ac…

Vue | 使用 ECharts 绘制折线图

目录 一、安装和引入 ECharts 二、使用 ECharts 2.1 新增 div 盒子 2.2 编写画图函数 2.3 完整代码结构 三、各种小问题 3.1 函数调用问题 3.2 数据格式问题 3.3 坐标轴标签问题 3.4 间隔显示标签 参考博客:Vue —— ECharts实现折线图 本文是在上…

jvm 内存泄露、内存溢出、栈溢出区别

JVM(Java虚拟机)是负责执行Java程序的运行环境。以下是对内存泄露、内存溢出和栈溢出这几个概念的解释: 内存泄露(Memory Leak): 内存泄露指的是程序中分配的内存空间在不再被使用时没有被释放的情况。这可…

【DFS深度优先搜索专题】【蓝桥杯备考训练】:迷宫、奶牛选美、树的重心、大臣的旅费、扫雷【已更新完成】

目录 1、迷宫(《信息学奥赛一本通》) 2、奶牛选美(USACO 2011 November Contest Bronze Division) 3、树的重心(模板) 4、大臣的旅费(第四届蓝桥杯省赛Java & C A组) 5、扫…

git的下载与安装

下载 首先,打开您的浏览器,并输入Git的官方网站地址 点击图标进行下载 下载页面会列出不同操作系统和平台的Git安装包。根据您的操作系统(Windows、macOS、Linux等)和位数(32位或64位),选择适…

面试经典-33-反转链表 II

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a…

【渗透测试】redis漏洞利用

redis安装及配置 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ vi redis.conf #修改内容如下&#xff1a; #protected-mode …

【消息队列开发】 实现MemoryDataCenter类——管理内存数据

文章目录 &#x1f343;前言&#x1f334;数据格式的准备&#x1f332;内存操作&#x1f6a9;对于交换机&#x1f6a9;对于队列&#x1f6a9;对于绑定&#x1f6a9;对于单个消息&#x1f6a9;对于队列与消息链表&#x1f6a9;对于未确认消息&#x1f6a9;从硬盘上读取数据 ⭕总…

【数据结构】栈与队列的“双向奔赴”

目录 前言 1.使用“栈”检查符号是否成对出现 2.使用“栈”实现字符串反转 3.使用“队列”实现“栈” 4.使用“栈”实现“队列” 前言 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是一种特殊的线性数据集合&#xff0c;只允许在栈顶按照后进先出LIFO&#xff…

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…

DIY小车神器 - 智能轮式驱动单元

为了便于做智能小车的朋友快速方便的构建自己的小车&#xff0c;我很早前设计过一个轮式驱动单元&#xff0c;将电机、驱动电路、轮子集成在一起&#xff0c;只需使用TTL电平的IO口即可驱动&#xff0c;即常见的核心板或开发板可以直接驱动&#xff0c;无需外加电路。&#xff…

Ubuntu Argoverse API安装

1. 创建并进入conda环境 conda create -n Argoverse python3.8 conda activate Argoverse2. 拉取argoverse-api源码 git clone https://github.com/argoai/argoverse-api.git3. 下载高精地图 Download hd_maps.tar.gz from Argoverse 4. 安装api cd argoverse-api pip in…

探索设计模式的魅力:探索发布-订阅模式的深度奥秘-实现高效、解耦的系统通信

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并坚持默默的做事。 探索发布-订阅模式的深度奥秘&#xff1a;实现高效、解耦的系统通信 文章目录 一、案例场景&am…

如何在Ubuntu中查看编辑lvgl的demo和examples?

如何在Ubuntu中查看编辑lvgl的demo和examples&#xff1f; 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库&#xff0c;找到lv_port_pc_eclipse这个仓库&#xff0c;点进去 拉取仓库代码和子仓库代码 仓库网址&#xff1a;https://github…

如何让intellij idea支持一个目录多个springtboot或maven项目

一、背景 有的时候&#xff0c;我们希望intellij idea 能像 eclipse 一样有workspace的概念&#xff0c;能在一个workspace目录里面引入多个项目&#xff0c;如&#xff1a; 我们有项目a、项目b&#xff0c;现在的项目几乎都是springboot项目&#xff08;即maven项目&#xf…

【机器学习300问】35、什么是随机森林?

〇、让我们准备一些训练数据 idx0x1x2x3x4y04.34.94.14.75.5013.96.15.95.55.9022.74.84.15.05.6036.64.44.53.95.9146.52.94.74.66.1152.76.74.25.34.81 表格中的x0到x4一共有5个特征&#xff0c;y是目标值只有0,1两个值说明是一个二分类问题。 关于决策树相关的前置知识&am…

Android分区存储到底是怎么回事

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

STM32系列——F103C8T6 控制SG90舵机(HAL库)

文章目录 一、舵机控制原理二、.CubeMX配置配置RCC、SYS、时钟树配置RCC配置SYS配置时钟树配置定时器产生PWM波形 Keil5代码接线图及效果如果您发现文章有错误请与我留言&#xff0c;感谢 一、舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲&#xff0c;该脉冲的高电平…