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

news2024/12/25 14:28:08

       大家好呀,今天我们也是多久没有更新博客了,今天来讲讲我们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.coloradmin.cn/o/2170209.html

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

相关文章

CDF 累积分布函数图 怎么看

以上图为例&#xff0c;图中有五个数据集&#xff0c;每条曲线代表每个数据集中流的数量&#xff0c;然后我以蓝色的线条为例去解释怎么看这个图。 红色的方框的点说明&#xff0c;dataset-1中流数量少于500的app占全部app的20%&#xff1b;紫色的方框的点说明&#xff0c;da…

win10下NAT 端口转发及ssh VMware ubuntu24虚拟机

问题&#xff1a;win10无法访问VMware ubuntu24虚拟机。ping不通&#xff0c;ssh不通。 现象&#xff1a; 无法设置网桥模式。原因不明。win10 网络连接 中没有vmnet0 网桥模式。win10 网络连接 中&#xff0c;有vmnet8的NAT模式&#xff0c;有vmnet1的仅主机模式。VMware ub…

【Redis】Linux下安装配置及通过C++访问Redis

文章目录 一、Linux Centos 7.0版本下的安装及配置二、通过C访问Redis 一、Linux Centos 7.0版本下的安装及配置 通过源来安装&#xff0c;此次安装的版本为 redis 5.0 的&#xff0c;要通过其他源进行安装&#xff0c;首先安装 scl 源 yum install centos-release-scl-rh再安…

【LeetCode】每日一题 2024_9_26 数组元素和与数字和的绝对差(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;数组元素和与数字和的绝对差 代码与解题思路 func differenceOfSum(nums []int) int {sum1, sum2 : 0, 0for _, v : range nums {sum1 vfor v > 0 {sum2 v%10v / 10}}return sum1-s…

教师工作量在线管理服务

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)

文章目录 1、docker部署Mysql2、dockerfile构建镜像1.1、在idea中导入课件中的项目资料\day01\ebuy-docker1.2、修改项目application.yml数据库连接参数1.3、启动项目访问测试&#xff1a;http://localhost:8081/1.4、执行mvn package命令进行项目打包1.5、虚拟机中新建目录/op…

高性能计算秘密武器:NVIDIA B100与B200如何让你的HPC性能飙升?

嘿&#xff0c;各位科技界的狂热粉丝、AI领域的探索先锋&#xff0c;你们是否正站在高性能计算&#xff08;HPC&#xff09;的十字路口&#xff0c;寻找那把能开启全新纪元的钥匙&#xff1f;今天&#xff0c;就让我带你深入剖析NVIDIA的最新力作——B100与B200&#xff0c;一同…

C++结尾

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

【JAVA开源】基于Vue和SpringBoot的网上租赁系统

本文项目编号 T 050 &#xff0c;文末自助获取源码 \color{red}{T050&#xff0c;文末自助获取源码} T050&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 用…

生信软件37 - 基于测序reads的变异进行单倍型分型工具WhatsHap

1. WhatsHap简介 WhatsHap是一种使用DNA测序reads的基因组变异进行定相&#xff08;分型&#xff09;的软件&#xff0c;即基于reads的定相或单倍型组装&#xff0c;特别适用于长reads &#xff08;三代测序数据&#xff09;&#xff0c;但也兼容短reads的定相。 Whatshap特点…

Ubuntu22.04安装cudnn详细步骤

下载指定版本的cudnn https://developer.nvidia.com/rdp/cudnn-archive#a-collapse804-111 安装 sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb 根据上步提示&#xff1a; sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-…

【C++】STL标准模板库容器set

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;关联式容器set(集合)简介 &#x1f4cc;set(集合)的使用 &#x1f38f;set(集合)的模板参数列表 &#x1f38f;set(集合)的构造函数 &#x1f38f;set(集合)的迭代…

【算法题】72. 编辑距离-力扣(LeetCode)

【算法题】72. 编辑距离-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个…

哈希算法以及容器实现

哈希 一&#xff0c;哈希算法1.什么是哈希2.哈希产生的原因3.常见哈希算法4.闭散列&#xff08; 哈希表&#xff09;1.线性探测2.二次探测 5.开散列&#xff08;哈希桶&#xff09;1.开散列插入2.开散列扩容 二&#xff0c;代码实现1.哈希表2.哈希桶1.迭代器的实现2.底层容器的…

C++ --- 模板为什么不能分离编译?

模板为甚么不能分离编译&#xff0c;但普通函数却可以&#xff1f; 一、前置知识二、普通函数能分离编译的原因三、模板不能分离编译的原因 一、前置知识 编译阶段: 源代码到目标代码&#xff1a; 编译器首先将源代码&#xff08;如C/C文件&#xff09;翻译成汇编语言&#x…

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

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

CentOs-Stream-9 设置静态IP外网访问

CentOs-Stream-9 设置静态IP&#xff0c;实现外网访问。这里面有些需要注意的地方&#xff0c;比如IP网段跟我们的宿主机不一样&#xff0c;需要查看具体的网络适配器网段&#xff0c;这样可以快速实现网络互通&#xff1b;另外它的网络配置文件也是不一样的。网络适配器对应的…

放弃 startActivityForResult,Activity Result API 优雅使用

放弃 startActivityForResult&#xff0c;Activity Result API 优雅使用 Activity Result API 是 androidx 中的一个新 api&#xff0c;旨在替代原有的 startActivityForResult 方法&#xff0c;用于在两个 Activity 或 Fragment 交换数据、获取返回结果。 过去如果 Activity…

了解独享IP的概念及其独特优势

在网络世界中&#xff0c;IP地址是用来识别和定位设备的标识符。独享IP是一种服务模式。使用代理服务器时&#xff0c;用户拥有一个不与其他用户共享的专用独立IP地址。与共享IP相比&#xff0c;独享IP为用户提供了更高的独立性和隐私保护。下面详细介绍独享IP的定义、工作原理…

OJ在线评测系统 后端 代码沙箱原生实现 初始化项目

代码沙箱Java原生实现 之前我们完成了快速的前端页面开发 重点是在后端 历史问题修复 Java原生代码沙箱实现 docker代码沙箱实现 解决历史遗留问题 代码编辑器切换语言失败 监听language属性 动态更改编辑器的语言 我们在这里实现的是一个线程形式的监听 watch(() > …