当前位置: 首页 > news >正文

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;
}

    总结

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

相关文章:

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

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…...

数据库系列(1)常见的四种非关系型数据库(NoSQL)

非关系型数据库&#xff08;NoSQL&#xff09; 非关系型数据库适用于需要灵活数据模型和高可扩展性的场景。常见的非关系型数据库包括&#xff1a; MongoDB&#xff1a;文档数据库&#xff0c;以JSON-like格式存储数据&#xff0c;适合快速开发和迭代。Cassandra&#xff1a;…...

大规模预训练语言模型的参数高效微调

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练语言模型&#xff08;PLMs&#xff09;在特定下游任务上的微调和存储成本极高&#xff0c;这限制了它们在实际应用中的可行性。为了解决这一问题&#xff0c;来自清华大学和北京人工智能研究院的研究团队探索了一种优化模型…...

一场大模型面试,三个小时,被撞飞了

去华为面试大模型&#xff0c;一点半去五点半回&#xff0c;已经毫无力气。 1️⃣一轮面试—1小时 因为一面都是各个业务的主管&#xff0c;所以专业性很强&#xff0c;面试官经验很丰富&#xff0c;建议大家还是需要十分熟悉所学内容&#xff0c;我勉强通过一面。 2️⃣二轮…...

Python每次for循环向list中添加多个元素

Python中&#xff0c;我每次for loop要产生几个结果。要将这些结果加到一个list中。怎么最高效&#xff1f; 答: list extend 方法 在Python中&#xff0c;如果你想在循环中将多个元素添加到列表中&#xff0c;最直接和最高效的方式是使用列表的 append() 方法。每次循环时&a…...

Java爬虫抓取数据的艺术

在信息时代&#xff0c;数据的重要性不言而喻。对于Java开发者来说&#xff0c;掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序&#xff0c;我们可以从互联网的海量信息中提取有价值的数据&#xff0c;用于市场分析、客户洞察、内容监控等多种场景。本文将介…...

Unity场景内画车道线(根据五阶曲线系数)

之前做过使用Dreamteck Splines插件构建车道线之前需求是给定车道线的点位&#xff0c;根据点位来进行构建。 由于AI识别出来的点位不线性&#xff0c;画出来的车道线经常是歪七扭八&#xff0c;所以使用五阶曲线系数进行构建。 使用在线图形计算器进行测试构建&#xff0c;公式…...

IPLOOK百万级用户容量核心网惊艳亮相北京PT展

2024年9月25日&#xff0c;以“推动数实深度融合&#xff0c;共筑新质生产力”为主题&#xff0c;本届中国国际信息通信展&#xff08;PT展&#xff09;在北京国家会议中心正式拉开帷幕。 广州爱浦路网络技术有限公司&#xff08;简称&#xff1a;IPLOOK&#xff09;&#xff…...

家庭网络的ip安全性高吗

家庭网络的IP安全性是一个重要的话题&#xff0c;涉及到如何保护家庭设备和用户的隐私。家庭网络的安全性既有其优势&#xff0c;也存在一些潜在的风险。以下是关于家庭网络IP安全性的几个关键点&#xff1a; 1. 家庭网络的优势 私有IP地址的使用 家庭网络中的设备通常使用私…...

LLM阅读推荐

&#xff08;按名称排序&#xff09; 【徹底解説】これからのエンジニアの必携スキル、プロンプトエンジニアリングの手引「Prompt Engineering Guide」を読んでまとめてみた(opens in a new tab)3 Principles for prompt engineering with GPT-3(opens in a new tab)A beginn…...

计算机网络笔记001

讲义 1.计算机网络的定义  定义&#xff1a; 一批独立自治的计算机系统的互连集合体  说明&#xff1a; 独立自治的计算机系统&#xff0c; 互连的手段是各种各样的&#xff0c; 依据协议进行 工作  2.计算机网络和通信网络  通信网络&#xff1a; 重点研究通…...

如何用IDEA连接HBase

编写java代码&#xff0c;远程连接HBase进行相关的操作 一、先导依赖 代码如下&#xff1a; 二、连接成功...

【JS代码规范】如何优化if-else代码规范

1. 快速结束&#xff0c;减少没必要的else 案例一&#xff1a;2种互斥的条件判断 function test(data) {let result ;if (data < 0) {result 负数;} else {result 非负数;}return result; }优化一&#xff1a; function test(data) {if (data < 0) {return 负数;} …...

MovieLife 电影生活

MovieLife 电影生活 今天看到一个很有意思的项目&#xff1a;https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常&#xff0c;这类想法只是一闪而过&#xff0c;很少会付诸实践。但这次有所不同。假如你的生活是一部电影&#xff0c…...

网工内推 | 中级云运维工程师,双休,五险一金

01 博达人才 &#x1f537;招聘岗位&#xff1a;中级云运维工程师 &#x1f537;岗位职责 1、受理数据中心、云租户投诉、受理故障工单&#xff0c;并在时限内完成。 2、协助客户开通云产品&#xff0c;解答客户使用过程中的疑问。 3、处理云产品故障&#xff0c;协助进行故…...

Thingsboard规则链:Related Entity Data节点详解

引言 在复杂的物联网&#xff08;IoT&#xff09;生态系统中&#xff0c;数据的集成与分析是实现高效管理和智能决策的基础。Thingsboard作为一个强大的开源物联网平台&#xff0c;其规则链&#xff08;Rule Chains&#xff09;机制允许用户构建自定义的数据处理流程。其中&am…...

C++结尾

面试题 1.什么是虚函数&#xff1f;什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了&#xff0c;父子类中只有一个该函数。如果在子类重写虚函数&#xff0c;那么用的就是子类重写的虚函数&#xff1b;如果子类没有重写虚函数&#xff0c;那么调用的是父类继承的虚函…...

Flutter鸿蒙化环境配置(windows)

Flutter鸿蒙化环境配置&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (v…...

Vue入门之生命周期

文章目录 一、Vue 生命周期概述二、生命周期的四个阶段1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段 三、代码案例四、总结 在 Vue 开发中&#xff0c;理解生命周期是非常重要的。Vue 的生命周期可以帮助我们在不同的阶段执行特定的逻辑&#xff0c;从而更好地控制组件的行为…...

UNI-SOP应用场景(1)- 纯前端预开发

在平时新项目开发中&#xff0c;前端小伙伴是否有这样的经历&#xff0c;hi&#xff0c;后端小伙伴们&#xff0c;系统啥时候能登录&#xff0c;啥时候能联调了&#xff0c;这是时候往往得到的回答就是&#xff0c;再等等&#xff0c;我们正在搭建系统呢&#xff0c;似曾相识的…...

力扣9.23

1014. 最佳观光组合 给你一个正整数数组 values&#xff0c;其中 values[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的 距离 为 j - i。 一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为 values[i] values[j] i - j &#xff0c;…...

[Redis][事务]详细讲解

目录 0.什么是事务&#xff1f;1.Redis 事务本质2.Redis 事务意义3.事务操作1.MULTI2.EXEC3.DISCARD4.WATCH5.UNWATCH 0.什么是事务&#xff1f; Redis的事务和MySQL的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行Redis事务和M…...

Latex——一行的划线 如何分开

代码&#xff1a; \cmidrule(r){3-4} \cmidrule(r){5-6} \cmidrule(r){7-8}效果&#xff1a; 参考文章&#xff1a; LaTeX技巧653&#xff1a;如何隔开LaTeX表格邻近\cline表格线&#xff1f;...

大数据:快速入门Scala+Flink

一、什么是Scala Scala 是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”&#xff08;Scalable Language&#xff09;的缩写&#xff0c;意味着它被设计为能够适应不同规模的项目&#xff0c;从小型脚本到大型分布式…...

侧边菜单的展开和折叠

环境准备&#xff1a;Vue3Element-UI Plus <script setup> import {ref} from "vue";// 是否折叠菜单&#xff0c;默认折叠 const isCollapse ref(true)</script><template><el-container><el-aside><el-menu:collapse"isCo…...

自动化办公-Python中的for循环

for 循环是 Python 中用于迭代&#xff08;遍历&#xff09;序列&#xff08;如列表、元组、字典、集合、字符串&#xff09;或其他可迭代对象的控制结构。它允许您逐一访问序列中的每个元素&#xff0c;并对其执行操作。以下是对 for 循环的详细介绍&#xff0c;包括语法、使用…...

Python_itertools

itertools itertools.count(start, step) 返回一个无限迭代器&#xff0c;从指定的start开始&#xff0c;每次增加step。 import itertools # 从1开始&#xff0c;每次增加1&#xff0c;输出前5个数 for i in itertools.count(1, 1):if i > 5:breakprint(i)运行结果&#…...

Apache Iceberg 数据类型参考表

Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型&#xff0c;表示真或假true, false用于条件判断&#xff0c;例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合&#xf…...

职责链模式

职责链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这…...

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱&#xff…...