【C++】一文带你初识C++继承
食用指南:本文在有C基础的情况下食用更佳
🍀本文前置知识: C++类
♈️今日夜电波:napori—Vaundy
1:21 ━━━━━━️💟──────── 3:23
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
🍑一、继承和派生的概述
🍒 二、继承的语法
派生类定义格式:
继承方式分类:
基类个数分类:
派生类继承基类的规则 :
🍈三、继承中的构造函数和析构函数
构造和析构的顺序
🍉子类中的构造(重要)
知识点1:
知识点2:
🥝四、父类和子类的同名处理
成员变量的处理
成员函数的处理
🍑一、继承和派生的概述
在C++中,继承是一种对象-oriented编程(面向对象编程)的概念,它允许创建一个新的类(称为派生类)从一个现有的类(称为基类)继承属性和行为。通过继承,派生类可以获得基类的成员变量、成员函数和其他特性。
继承有几种类型:公有继承、私有继承和受保护的继承。在公有继承中,基类的公有成员在派生类中仍然是公有的;在私有继承中,基类的公有成员在派生类中变为私有的;在受保护的继承中,基类的公有成员在派生类中变为受保护的。
派生类可以通过继承来扩展基类的功能,它可以添加新的成员变量和成员函数,也可以重写基类的成员函数以改变其行为。派生类还可以访问基类的非私有成员。
继承的优点:减少代码的冗余 提高代码的重用性
一图让你认识继承和派生的概念~
🍒 二、继承的语法
派生类定义格式:
注意以下两个格式都是一样的,定义以及意义都是相同的!
class 子类: 继承方式 父类名{//子类新增的数据成员和成员函数};Class 派生类名 : 继承方式 基类名{//派生类新增的数据成员和成员函数};
继承方式分类:
public : 公有继承 (重要)
private : 私有继承
protected : 保护继承
基类个数分类:
单继承:指每个派生类只直接继承了一个基类的特征 (一个父类 派生出 一个子类)
多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基
类的特征(多个父类 派生出 一个子类)
注意:
子类继承父类,子类拥有父类中全部成员变量和成员方法(除了构造和析构之外的成员方法),但是在子类中,继承的成员并不一定能直接访问,不同的继承方式会导致不同的访问权限。
派生类继承基类的规则 :
一图让你理解~
🍈三、继承中的构造函数和析构函数
构造和析构的顺序
class Other{public:Other(){cout << "对象成员的构造函数" << endl;}~Other(){cout << "对象成员的析构函数" << endl;}};class Base {public:Base(){cout << "父类的无参构造函数" << endl;}~Base(){cout << "父类中的析构函数" << endl;}};class Son :public Base{public:Son(){cout << "子类的无参构造" << endl;}~Son(){cout << "子类中的析构函数" << endl;}Other ob;//对象成员};void test01(){Son ob1;}
运行结果如下:
一图让你理解~
🍉子类中的构造(重要)
先看以下代码:
父类
class Base{private:int a;public:Base(){cout << "父类的无参构造函数" << endl; }Base(int a){this-> a = a;cout << "父类的有参构造函数" << endl;}~Base(){cout << "父类中的析构函数" << endl;}};
知识点1:
子类会默认调用 父类的 无参构造
子类1:
class Son :public Base{private:int b;public:Son(){cout << "子类的无参构造" << endl;}Son(int b){this->b = b;cout << "子类的有参构造函数int" << endl;}~Son(){cout << "子类中的析构函数" << endl;}};void test01(){ Son ob1(10);}
运行结果:
知识点2:
子类 必须显示 使用初始化列表 调用 父类的有参构造
子类2:
class Son :public Base{private:int b;public:Son(){cout << "子类的无参构造" << endl;}Son(int b){this-> b = b;cout << "子类的有参构造函数int" << endl;}//子类必须用 初始化列表 显示的调用父类的有参构造//父类名称(参数)Son(int a, int b) :Base(a)//显示的调用父类的有参构造{this-> b = b;cout << "子类的有参构造函数 int int" << endl;}~Son(){cout << "子类中的析构函数" << endl;}};void test01(){ //子类 默认 会调用 父类的无参构造//子类必须用 初始化列表 显示的调用父类的有参构造//父类名称+()Son ob2(10, 20);}
运行结果:
🥝四、父类和子类的同名处理
成员变量的处理
1、当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员
2、如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域。
栗子:
class Base{//父类的私有数据 一旦涉及继承 在子类中不可见public:int num;public:Base(int num){this-> num = num;cout << "Base有参构造int" << endl;}~Base(){cout << "析构函数" << endl;}};class Son :public Base{private:int num;public:Son(int num1, int num2) :Base(num1){this-> num = num2;cout << "有参构造int int" << endl;}~Son(){cout << "析构函数" << endl;}void showNum(void){//如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域cout << "父类中的num = " << Base::num << endl; //当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员cout << "子类中的num = " << num << endl;}};void test01(){Son ob1(10, 20);ob1.showNum();}
运行结果:
成员函数的处理
1、子类继承父类所有成员函数 和成员变量
2、一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数
栗子:
class Base{public:void func(void){cout << "父类中的void func" << endl;}void func(int a){cout << "父类中的int func a = " << a << endl;}};class Son :public Base{public://一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数void func(void){cout << "子类中voidfunc" << endl;}};void test01(){//为啥构造和析构除外?父类的构造和析构 只有父类自己知道该怎么做(构造和析构 系统自动调用)//子类会继承父类所有成员函数(构造和析构函数除外) 和成员变量Son ob1;ob1.func();//ob1.func(10);//err //一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数//如果用户 必须要调用父类 的同名成员函数 必须加作用域ob1.Base::func();//调用父类的void funcob1.Base::func(10);//调用父类的int func}
运行结果:
本文仅仅为对于C++中继承的基础知识,重要的还是在虚函数那一块,下一篇,我会详细的介绍虚函数!希望大家继续支持Thanks♪(・ω・)ノ
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~
相关文章:

【C++】一文带你初识C++继承
食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识: C类 ♈️今日夜电波:napori—Vaundy 1:21 ━━━━━━️💟──────── 3:23 …...

SDK是什么,SDK和API有什么区别
SDK(Software Development Kit)是一种开发工具包,通常由软件开发公司或平台提供,用于帮助开发人员构建、测试和集成特定平台或软件的应用程序。SDK 包含一系列的库、工具、示例代码和文档,旨在简化开发过程并提供所需的…...

golang中使用chan控制协程并发简单事例
func main() {processNum : 5ch : make(chan struct{}, processNum)for true {ch <- struct{}{}go func() {defer func() {<-ch}()fmt.Println("我是协程", time.Now().UnixNano())time.Sleep(time.Second * 5)}()} } 可以看到,这里每5s会执行一次带…...

好用画流程图软件推荐 excalidraw
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...

【RP2040】香瓜树莓派RP2040之搭建开发环境(windows)
本文最后修改时间:2022年08月23日 01:57 一、本节简介 本节以树莓派pico开发板为例,搭建windows下的编译环境。 二、实验平台 1、硬件平台 1)树莓派pico开发板 ①树莓派pico开发板 ②micro usb数据线 2)电脑 2、软件平台 …...

基于springboot线上礼品商城
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发
目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…...

kubernetes集群(k8s)之安装部署Calico 网络
目录 安装部署Calico 网络 (一)环境准备 (二)部署docker环境 (三)部署kubernetes集群 (四)部署Calico网络插件 安装部署Calico 网络 (一)环境准备 IP地…...
【C/C++】C++11 Lambda 表达式捕获变量使用技巧
在 C11 中,lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号 [] 中,用来指定 lambda 表达式捕获哪些变量。 捕获列表有以下几种形式: []:不捕获任何变量。[&]&#x…...

大势智慧软硬件技术答疑第八期
1.DasViewer可以使用同一个账号登录多台电脑,然后同时进行格式转换操作吗? 答:可以的 2.在DasViewer里面添加了标注点,能手动修改标注点坐标、手动输入坐标值 吗? 答:目前DasViewer暂不支持手动输入坐标 …...
jvm-jvm与java体系结构
1.JAVA及JVM简介 jvm发展历程 sun classic vm jdk1.4时完全被淘汰 2.虚拟机与JAVA虚拟机 java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行,每一条java指令,java虚拟机中都有…...

Three.js 实现材质边缘通道发光效果
相关API的使用: 1. EffectComposer(渲染后处理的通用框架,用于将多个渲染通道(pass)组合在一起创建特定的视觉效果) 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入,使用Three.…...

【MFC】10.MFC六大机制:RTTI(运行时类型识别),动态创建机制,窗口切分,子类化-笔记
运行时类信息(RTTI) C: ##是拼接 #是替换成字符串 // RTTI.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <afxwin.h>#ifdef _DEBUG #define new DEBUG_NEW #endifCWinApp th…...

ui设计师个人年终工作总结2020最新范文5篇
ui设计师个人年终工作总结(一) 我于20年x育人x日成为公司的试用员工,安排在技术研发中心担任UI界面设计一职,现将我的工作情况分为三个阶段来总结如下汇报: 一、萌芽阶段 记得初次应聘时,我对公司的认识仅仅局限于行业之一&#x…...

开源数据库Mysql_DBA运维实战 (修改root密码)
MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助 方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql> set pass…...
javap获取Kotlin方法JNI方法签名
获取Kotlin方法签名和JAVA不一样的地方就是需要使用Kotlin 命令行编译器生成.class文件: 编写一个Kotlin类,添加JNI方法: class TestLib {external fun init(callBack: CallBack)interface CallBack{fun onData(count:Int,data:String)} }在…...

ARM-M0内核MCU,内置24bit ADC,采样率4KSPS,传感器、电子秤、体脂秤专用,国产IC
ARM-M0内核MCU 内置24bit ADC ,采样率4KSPS flash 64KB,SRAM 32KB 适用于传感器,电子秤,体脂秤等等...

【STM32】FreeRTOS消息队列和信号量学习
一、消息队列(queue) 队列是一种用于实现任务与任务之间,任务与中断之间消息交流的机制。 注意:1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验:创建一个消息队列…...

初始C语言(6)——详细讲解表达式求值以及其易错点
系列文章目录 第一章 “C“浒传——初识C语言(1)(更适合初学者体质哦!) 第二章 初始C语言(2)——详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言(3)——…...

【数据结构】树和二叉树
一、树的概念及结构 1、树的概念 树 是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&a…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...