c++----继承(初阶)

       大家好呀,今天我们也是多久没有更新博客了,今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢,大家从字面意思看,是不是像我们平常日常生活中很容易出现的,比如说电视剧里面什么富豪啊,去了之后他的子孙儿女来抢夺他的家产,继承他们的家产,是吧?这里面用到了继承。那我们这里继承用法是不是意思跟他们差不多呢?其实也是这样子的,我们c++语言中的继承也是这个样子,但是呢是上一辈与下一辈的就相当于是父亲对儿子的,如果你说爷爷对孙子的那没办法,只能父亲与子相继承的关系。相当于继承的话只能继承上一辈的家产。那么大家可能会想,既然是继承上一辈的家产嘛,那说明是家家中的继承就是继承上一辈的一些内容和数据。那只继承内容和数据吗?使用方法这些会继承吗?那么接下来这些就是我们要简单了解一下的继承的作用含义和用法。

继承的概念

        对于继承呢我们先了解他的概念,什么是继承的?那么我们还是照了规矩,先来一个官方的和一个我们自己的解释。对于官方的话就是:继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复⽤,继承是类设计层次的复⽤。这样看起来也可以理解为师傅与徒弟之间的关系,因为师傅把自己毕生所学传递给了徒弟,然后徒弟可以在此基础上进行增添自己的个人想法进行扩展。你这就是相当于个人的解释方法,当然也很多人认为是父与子的关系,因为下面进行定义的格式的话就是这样说的,也用的是父子关系这个形式。

        那么我们光看这些定义的话,其实还是比较能理解的,毕竟就是继承嘛。我把你的东西全给我了,然后我可以在你的基础上发挥,也可以直接用,不想再扩展也可以。但我们肯定还是要看简单的看一下大概长个什么样子吧,是吧?那么接下来大家看一下下面的图片:

class Animal {public void sound() {System.out.println("The animal makes a sound");}
}class Dog :pubilic Animal {public void sound() {System.out.println("The dog barks");}
}

        虽然没有实体店,但是可以直接设置这个代码。那我们再看一下,我们这里有一个里面有两个。大家完全可以猜一下哪个是师傅,哪个是徒弟?但大家这样为抢险而见的看见把我们上面的那个发一下下面这个明显有下一个的的名字。那么我们大胆想象一下上面类是师傅下面的类是徒弟嘞?但其实大家想一想也就知道了,毕竟徒弟嘛既然是徒弟,那么肯定是在师傅之后出现的呀,没有师傅哪来的徒弟,是不是?那么这里我们就向我们透露出来一个师傅必须在徒弟的前面,或者说是父亲必须在儿子的前面。

继承定义

       那么当我们大概了解了继承的概念,那么我们就要先来尝试着写出继承了。我们看看我们上面已经说过,父亲要在儿子之前好,这是第一个规则,那么儿子有什么要求呢?是吧?不然的话如果是王叔叔的是不是?那就尴尬了,对吧?那么所以我们对儿子的出现的时候是有特殊要求的。那么我们看一下下面这个图片,我们就可以知道父类对于子类子类去前夫类需要什么,大概需要什么东西。

        这个图片是我引用的另一个之类的,但是意思都是一样的,我们只需要看上面有箭头的。可不可以看到?首先我们可以看到无论是怎么写,我们继承都是累,所以在开头都是class,然后class之后名叫派生类,什么叫派生类嘞?其实就相当于我们子类的名字。知道了吧?就是我们脂类它的名字就在我们的内后写名字,然后一个冒号就是我们的继承方式,这个继承方式呢就是我们前面的访问限定符是不是,都是这三个。然后我们这里用的是公开的访问限定符,然后我们说过了有三个嘛,那么后面其他的都是可以用的,然后对于他其他的类型的不同的作用,我们后面是会说出来的。最后的我们的父类毕竟师出有名,是吧?所以我们需要在最后证明我们继承的是哪里来的类,它的名字叫什么?那么我们对于之前的开头需要准备答就结束了,就是我们那个表明然后类子类的名字,然后一个冒号,然后我们的广告信息图三选一,然后呢就是我们的父类是哪一个,那么我们就可以写出一个子类了。当然里面的这些数据其实就是可以使用的,儿子可以用父亲的内容了。当然这与我们的访问限制服务是有关联的,我们这里用的是公开的,那么就可以直接使用了。

访问限定符在子类的作用

       怎么说了?上面呢是我们继承之类的大概全部东西,然后我们其他的都还了解,那么稍微来一点儿知识点就是我们的访问限定符的作用了。那么接下来我们就是来讲讲访问限定服在继承中的作用是什么?大家先看一下上面的图片,是我们的访问建筑图三个相对于父类的作用。

       对于父类的不同的返工线礼服,然后我们不同的继承也有不同的作用。大家先看一下上面的表格,其实可能还不太能理解,那么下面我给大家总结几点,大家看一下:

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

        我给大家解释一下,首先我们的第一点意思就是说对于private的父类的话我们子类其实是可以继承的,但是呢我们只能看不能用。到时候可以尝试一下,就当我们继承了private父类的子类,如果运行看我们的数据,是不是数据改变了,但是如果一使用的话就会报错。这就是我们的第一句所想表达的意思。然后对于第2点的话就是简单的说明private是我们完全无法使用,只能看数据的变化。我们如果在实际中矿工必须要使用的话,那么我们就用private访问相比如相同的protectd,我们都知道这两个访问限定符意思都是一样的,都是保护的。但是Pro tectd是可以被我们子类所使用的。然后第2点就是向我们表达出,如果我们父类用的是保护的访问限定符,但是我们只能想使用的话,就将这个访问限定符改为potectd。然后第3点呢其实也很好理解,就是大家看我们的公开,我们是可以将父类里面的所有数据进行使用,然后呢就是长的那个是保护的红线制图,可以将父类中的保护使用,是吧?然后就是我们对于继承最无用的限定符。属于这个继承的排列呢,其实就是按照它的使用的多少来排列的,当然只是按含义,大家不要以为是具体的多少。然后第4点呢其实就是给我们讲述一个习惯嘛,用的时候可以不用写private,使用struct的时候,会直接默认限定符是pudilc。但是我们也知道这种东西还是要写着写着你才真的有意思。所以呢我们第4点其实大家可以知道一下就可以了,最好不要采用。然后第4点呢其实就是给我们讲述一个习惯嘛,用的时候可以不用写private,使用struct的时候,会直接默认限定符是pudilc。但是我们也知道这种东西还是要写着写着你才真的有意思。所以呢我们第4点其实大家可以知道一下就可以了,最好不要采用。当然大家如果想对上面的的几个访问限定符的实际使用的例子的话,可以看看下面的一些代码来实现一下:

// 实例演⽰三种继承关系下基类成员的各类型成员访问关系的变化
class Person
{
public :
void Print ()
{
cout<<_name <<endl;
}
protected :
string _name ; // 姓名
private :
int _age ; // 年龄
};
//class Student : protected Person
//class Student : private Person
class Student : public Person
{
protected :
int _stunum ; // 学号
};

        大家如果对上面的代码感兴趣的话,大家就使用一下上面的代码号了。

基类和派⽣类间的转换

       接下来我们说的是父亲与儿子之间的转换,这个大家可能会觉得有点问题啊。怎么儿子与父亲可以转换呢?那么大家可以先看一下下面这些部分。派生类转换为基类是安全的,而基类转换为派生类需要谨慎使用,因为基类指针或引用可能无法访问派生类的特有成员和方法,这可能导致运行时错误。因此,在进行向下转型时,最好先使用dynamic_cast进行类型检查,以确保转换的安全性。对于基类与派生类的转换呢,其实上面也说的比较清楚,就是说儿子转化为父亲倒是还可以,毕竟嘛可以再生孩子嘛,但是父亲展望儿子,那是不是就有点怪怪的了?所以呢对于这个我们下面有3点可以大家看一看。

public继承的派⽣类对象 可以赋值给 基类的指针 / 基类的引⽤。这⾥有个形象的说法叫切⽚或者切 割。寓意把派⽣类中基类那部分切出来,基类指针或引⽤指向的是派⽣类中切出来的基类那部分。
基类对象不能赋值给派⽣类对象。
基类的指针或者引⽤可以通过强制类型转换赋值给派⽣类的指针或者引⽤。但是必须是基类的指针是指向派⽣类对象时才是安全的。这⾥基类如果是多态类型,可以使⽤RTTI(Run-Time Type
Information)的dynamic_cast 来进⾏识别后进⾏安全转换。

         如果我们想解答一下上面的话,那么第第一点就是说我们用pudlic继承的子类可以给鸡类的指针或激烈的引用,怎么说呢?就相当于是把儿子中的那部分拿出来,然后给父亲的朋友们使用。虽然可能这么解释起来有点麻麻木了,但其实大家可以简单的理解一下是这个意思。然后呢第2点就是说积累的对象不能付给派生的就是父亲的朋友不能给儿子的使用就相当于是父亲的人脉,是父亲的儿子的不能使用,因为父亲好面子,所以不能给儿子使用。对于第三点呢,就是说鸡肋的指针或引用可以用强制类型转换给派生类使用,但是呢我们必须在后面用一个什么?Dynamic-cast来进行转换。然后大家如果·想对上面的三点进行验证的话可以试试下面的代码来看看是不是这样的:

class Person
{
protected :
string _name; // 姓名
string _sex; // 性别
int _age; // 年龄
};
class Student : public Person
{
public :
int _No ; // 学号
};
int main()
{
Student sobj ;
// 1.派⽣类对象可以赋值给基类的指针/引⽤
Person* pp = &sobj;
Person& rp = sobj;
// ⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的
Person pobj = sobj;
//2.基类对象不能赋值给派⽣类对象,这⾥会编译报错
sobj = pobj;
return 0;
}

    总结

       好了,上面就是我们继承的出街的部分,当然大家可能会说这个继承好像没讲过啥呀,但反正大家如果对这一项课程来一个总结的话,就相当于我们说了一个父亲的一些东西可以给儿子用,然后是儿子如何继承父亲的那份遗产是如何继承,然后继承的方法有哪些,并且这些方法有什么后遗症,大家可以简单理解为这样。然后第三个我们说那个基类与派生类转换,然后呢这个其实大家稍微的了解一下嘛。毕竟现在我们西安最简单的知道继承如何使用和大概用法。就可以了,后面我们还会有继承进阶的。

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

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

相关文章

万魔头戴式耳机好用吗?万魔、西圣、索尼头戴式耳机决赛圈测评

现在耳机市场已经有各种不同类型的耳机&#xff0c;对于有降噪需求的人来说&#xff0c;头戴式耳机是一个不错的选择。那么对于后台有人私信说想知道万魔头戴式耳机好用吗&#xff1f;为了解答这个疑问&#xff0c;今天我就为大家评测西圣H1、万魔SonoFlow和索尼WH-CH520这三款…

【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器

文章目录 C list 容器详解&#xff1a;从入门到精通前言第一章&#xff1a;C list 容器简介1.1 C STL 容器概述1.2 list 的特点 第二章&#xff1a;list 的构造方法2.1 常见构造函数2.1.1 示例&#xff1a;不同构造方法2.1.2 相关文档 第三章&#xff1a;list 迭代器的使用3.1 …

【Linux】Linux 的 权限

一、 Linux 权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以在 linux 系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在 linux 下做有限的事情。超级用户的命令提示符是“#”&#xff0c;普…

初学51单片机之I2C总线与E2PROM

首先先推荐B站的I2C相关的视频I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 看完视频估计就大概知道怎么操作I2C了&#xff0c;他的LCD1602讲的也很不错&#xff0c;把数据建立tsp和数据保持thd&#xff0c;比喻成拍照时候的摆pose和按快门两个过程&#xff0c;感觉还是…

Mysql之索引优化

指定索引 当一个字段上既有单列索引&#xff0c;又有复合索引时&#xff0c;我们可以通过以下的SQL提示来要求该SQL语句执行时采用哪个索引&#xff1a; use index(索引名称)&#xff1a;建议使用该索引&#xff0c;只是建议&#xff0c;底层mysql会根据实际效率来考虑是否使用…

使用豆包MarsCode 实现高可用扫描工具

以下是「 豆包MarsCode 体验官」优秀文章&#xff0c;作者郝同学测开笔记。 前言&#xfeff; 最近接触K8s&#xff0c;了解到K8s提供了非常方便的实现高可用的能力&#xff0c;再加上掘金推出「豆包MarsCode初体验」征文活动&#xff0c;所以打算使用豆包 MarsCode IDE来实现…

LeetCode(Python)-贪心算法

文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址&#xff08;一&#xff09;穷举算法贪心算法 物流站的选址&#xff08;二&#xff09;回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。如果你…

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

文章目录 1、 buildroot源码获取2、buildroot配置3、buildroot编译4、挂载根文件系统 在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中&#xff0c;我们编译了kernel&#xff0c;并在qemu上进行了运行&#xff0c;但到最后&#xff0c;在挂载根文件系统时候&#xff0c;挂…

python之装饰器、迭代器、生成器

装饰器 什么是装饰器&#xff1f; 用来装饰其他函数&#xff0c;即为其他函数添加特定功能的函数。 装饰器的两个基本原则&#xff1a; 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象&#xff1f; 在python的任意对象中&#xff…

C# DotNetty客户端

1. 引入DotNetty包 我用的开发工具是VS2022&#xff0c;不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…

【AD那些事 10 】焊盘如何修改为自己想要的形状!!!!! 焊盘设计规则如何更改??????

左侧为修改前焊盘原图 右侧为修改后焊盘图 ——————————————————————————————————————————— 目录 修改焊盘内侧的大小 修改焊盘外侧的大小 更改焊盘设计规则 ——————————————————————————…

Pencils Protocol 即将登录各大 CEX,依旧看好 $DAPP

近期&#xff0c;Scroll生态头部DeFi协议Pencils Protocol迎来了系列重磅市场进展。自9月18日开始&#xff0c;$DAPP通证分别在Tonkensoft、Bounce以及Coresky等平台陆续开启了IDO&#xff0c;并且在短期内售罄。同时在通证售卖完成后&#xff0c;DAPP 通证又在9月27日陆续登录…

RUST语言的初印象-从一个模拟登陆谈起-slint+reqwest+aes

本文就一个做了三四天的小程序讲第一次学用RUST的感受&#xff0c;内附代码。 了角语言 从一些渠道听说了R&#xff0c;这个字母挺魔性&#xff0c;那个文章说C和R的团体已经上升到了宗教崇拜的高度&#xff0c;然后&#xff0c;我觉得必 有过人之处&#xff0c;大约10年没碰…

通用运维基础

一 网络基础 知识点:网络交换1.1 VLAN1.2VxLAN2.网络路由3.网络常用命令目标:1. 了解网络的基本概念 2. 掌握常用的网络排错命令 1、网络交换 1.1 网络虚拟化 什么是网络虚拟化 网络虚拟化是指虚拟网络节点之间的连接并不使用物理线缆连接,而是依靠特定的虚拟化链路相连…

TCP的第三次握手没有回复,会出现哪些问题现象

从三次握手的一开始来讲&#xff0c;刚开始客户端和服务器都处于close状态 这里不能是2次握手的原因就在于&#xff0c;服务器端即女孩子&#xff0c;无法确认客户端即男孩子&#xff0c;是否已经收到了&#xff0c;我也愿意建立连接即我也爱你&#xff0c;这一条最终确认的信息…

软件对比 | 历史气象数据哪里找?

中国气象网和羲和能源气象大数据平台两个平台当然没有“绝对”哪个好的说法&#xff0c;各自特点都在下图进行总结&#xff0c;到底用哪个还是根据自己需求自己抉择。 希望可以帮助到大家~

DK5V100R15ST1直插TO220F,12V 4A两个引脚同步整流芯片

高性能两个引脚同步整流芯片 DK5V100R15ST1产品 概述DK5V100R15ST1是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机…

.NET 6 中,使用 ActionFilterAttribute 实现 AOP(面向切面编程)

AOP概述&#xff1a;AOP&#xff08;面向切面编程&#xff09;是一种编程规范的风格&#xff0c;通过横切的思想&#xff0c;将系统功能和业务功能分离开&#xff0c;以提高代码的可维护性和清晰度。 系统功能模块&#xff1a; 1、缓存模块&#xff1a; 作用&#xff1a;提高…

拥塞控制算法的 rtt 公平性

我强调过&#xff0c;拥塞控制的核心在公平可用性&#xff0c;公平性由 buffer 动力学保证&#xff0c;而 buffer 动力学有两种表现形式&#xff1a; buffer 占比决定带宽占比&#xff0c;以 aimd 为例&#xff1b;带宽越小&#xff0c;buffer 挤兑加速比越大&#xff0c;以 b…

如何选择高品质SD卡

如何选择高品质SD卡 SD卡&#xff08;Secure Digital Memory Card&#xff09;是一种广泛使用的存储器件&#xff0c;因其快速的数据传输速度、可热插拔的特性以及较大的存储容量&#xff0c;广泛应用于各种场景&#xff0c;例如在便携式设备如智能手机、平板电脑、运动相机等…