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

C++快速理解之继承

一、继承和派生

1.是什么?

C++ 中的继承是类与类之间的关系,与现实世界中的继承类似
例如:儿子继承父亲的财产

继承(Inheritance)可以理解为一个类另一个类获取成员变量成员函数的过程

例如:
类B继承于类A,那么B就拥有A的成员变量和成员函数

在C++中,派生(Derive)和继承是一个概念,只是站的角度不同
继承是儿子接收父亲的产业,派生是父亲把产业传承给儿子

被继承的类称为父类或基类,继承的类称为子类或派生类

“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼

2.为什么?

子类除了拥有父类的成员,还可以定义自己的新成员,以增强类的功能
以达到青出于蓝胜于蓝,一代比一代强

以下是两种典型的使用继承的场景:

当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能

当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。可以将这些类的共同成员提取出来,定义为父类,然后从父类继承,既可以节省代码,也方便后续修改成员

下面我们定义一个父类 People,然后定义了子类Student

#include<iostream>using namespace std;//父类(基类) Pelple
class People {
private:char *name;int age;public:void setName(char *name) {this->name = name;}char *getName() {return this->name;}void setAge(int age) {this->age = age;}int getAge() {return this->age;}
};//父类(派生类) Student
class Student : public People {
private:float score;public:void setScore(float score) {this->score = score;}float getScore() {return this->score;}
};//父类(派生类) Staff
class Staff : public People {
private:float money;public:void setMoney(float money) {this->money = money;}float getMoney() {return this->money;}
};int main() {// 创建Student学生对象Student boy;boy.setName("小明");boy.setAge(16);boy.setScore(95.5f);cout << boy.getName() << "的年龄是 " << boy.getAge() << ",成绩是 " << boy.getScore() << endl;// 创建Staff员工对象Staff girl;girl.setName("小丽");girl.setAge(18);girl.setMoney(15000.67);cout << girl.getName() << "的年龄是 " << girl.getAge() << ",月工资是 " << girl.getMoney() << "\n";return 0;
}

在这里插入图片描述
说明:

Student 类继承了 People 类的成员,同时还新增了自己的成员变量 score 和成员函数 setScore()、getScore()

继承过来的成员,可以通过子类对象访问,就像自己的一样

继承的一般语法为:

class 子类名:[继承方式]父类名{子类新增加的成员
};

继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private

二、在子类的函数中调用父类的成员

1.为什么?
既然父类中定义了成员变量、成员函数,那么肯定就可以在子类的成员函数中进行使用,否则继承就没有意义了

2.使用 this 调用
在子类的函数中,调用从父类继承而来的成员变量或成员函数,直接使用 this

三、重写

子类定义了与父类相同名字的函数,覆盖了父类的这个函数

扩展或者重新编写功能

重载不同,重载是函数名相同,但形参不同

注意:
被重写的父类成员函数,无论是否有重载,子类中都不会继承
除非使用了域解析运算符,才会调用父类的同名函数,子类中想要调用被覆盖的父类成员函数时,就需要使用作用域解析运算符 :: 来明确指定调用父类的版本,以避免产生歧义或错误。

四、多层继承

就是父类还有父类,父类的父类还有父类…

例如你爷爷有1000w,那么你爸爸就继承过来了,同样的道理 你也可以从你爸爸那里继承得到这笔钱
实例:

#include <iostream>using namespace std;class GrandPa {
public:void display() {cout << "GrandPa::display()\n";}void display_3() {cout << "GrandPa::display_3()\n";}
};class Father : public GrandPa {
public:void display() {cout << "Father::display()\n";}void display_2() {cout << "Father::display_2()\n";}};class Children : public Father {
public:void display() {cout << "Children::display()" << "\n";// 调用父类的成员函数this->display_2();// 调用被重写的父类成员函数Father::display();// 调用爷爷类中的成员函数this->display_3();// 调用被重写的爷爷类中的成员函数GrandPa::display();}};int main() {Children boy;boy.display();return 0;
}

在这里插入图片描述

五、多继承

C++ 允许存在多继承,也就是一个子类可以同时继承多个父类

#include <iostream>using namespace std;class Father {
public:void make_money() {cout << "赚钱" << endl;}
};class Mother {
public:void make_homework() {cout << "做好菜" << endl;}
};class Son : public Father, public Mother {};int main() {Son s;s.make_money();s.make_homework();return 0;
}

在这里插入图片描述

当多个父类有相同的函数名
注意:要在子类中重写这个函数,否则会出现编译错误,原因是二义性

相关文章:

C++快速理解之继承

一、继承和派生 1.是什么&#xff1f; C 中的继承是类与类之间的关系&#xff0c;与现实世界中的继承类似 例如&#xff1a;儿子继承父亲的财产 继承&#xff08;Inheritance&#xff09;可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如&#xff1a; 类B继承…...

Node.JS - 基础(Express)

目录 A. 简介 B. 下载,安装 C. 启动服务,查看文件结构 A. 简介 Express 是一个基于 Node.js 平台的极简、灵活的 Web 应用开发框架&#xff0c;它提供了一系列强大的功能来构建 Web 应用程序和 API。 一、Express 的基本特点 简洁的路由系统&#xff1a; Express 的路由系…...

I/O复用

I/O复用使得程序能够同时监听多个文件描述符&#xff0c;这对提高程序的性能至关重要。 举个例子&#xff1a; 就好比你天天玩手机&#xff0c;你妈为了监控你&#xff0c;在你房间安装了一个监控&#xff0c;这个监控可以实时监控你的一举一动&#xff0c;并上传到你妈手机上…...

【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题

目录 背景一. 报错信息1.1 报错的图片信息1.2 报错的文字信息 二. 解决报错2.1 下载 NetFx3.cab 文件2.2 执行命令 三. SQL Server 修复安装 背景 一次在阿里云服务器安装 SQL Server 2012时&#xff0c;系统报错了&#xff0c;导致安装进行不下去…通过在网上查找了多种解决方…...

STM32的SDIO接口详解

目录 1. 定义与兼容性 2. SDIO时钟 3. SDIO命令与响应 4. SDIO块数据传输 5. SDIO控制器的硬件结构 6.代码实现 1.SD初始化 2.测试SD卡的读取 3.测试SD卡的写入 STM32的SDIO&#xff08;Secure Digital Input/Output&#xff0c;安全数字输入输出&#xff09;接口是一…...

docker容器常用指令,dockerfile

docker&#xff1a;容器&#xff0c;主要是解决环境迁移的问题&#xff0c;将环境放入docker中&#xff0c;打包成镜像。 docker的基本组成&#xff1a;镜像(image)&#xff0c;容器(container)&#xff0c;仓库(repository)。镜像相当于类&#xff0c;容器相当于类的实例对象…...

C语言学习笔记 Day11(指针--下)

Day11 内容梳理&#xff1a; 目录 Chapter 7 指针 7.6 指针 & 函数 &#xff08;1&#xff09;形参改变实参的值 &#xff08;2&#xff09;字符数组作为函数参数 1&#xff09;合并字符串 2&#xff09;删掉字符串中空格 &#xff08;3&#xff09;指针作为函数返…...

(24)(24.2) Minim OSD快速安装指南(二)

文章目录 前言 6 MinimOSD-extra NG 7 替代硬件 前言 本文简要介绍了如何连接电路板。有关更多详细说明&#xff0c;请参阅 MinimOSD 项目维基(MinimOSD Project wiki)。 6 MinimOSD-extra NG 该项目位于此处(here)&#xff1b;文档位于此处(here)&#xff1b;支撑线位于此…...

GD32 MCU碰到IIC总线卡死怎么办?

大家在使用MCU IIC通信时&#xff0c;若碰到设备复位或者总线干扰等情况&#xff0c;可能会导致IIC总线卡死&#xff0c;表现上总线上SDA或者SCL其中一根线为低电平&#xff0c;IIC总线一直处于busy状态。此时若代码上一直等待总线空闲&#xff0c;则可能导致软件死机&#xff…...

算法——动态规划:0/1 背包问题

文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组6.1 两行实现6.2 单行实现6.3 优缺点 三、总结 一、问题描述 问题的抽象&#xff1a;给定 n n n 种物品和一个背包&#xff0c;第 i i i 个物品的体积为 c i c_i …...

又是奇瑞,“统一下班时间”过去不久,最近又整新活了...

奇瑞 345 345 可不是奇瑞的汽车型号&#xff0c;而是奇瑞 7 月份会议文章中提出的新策略。 简单来说&#xff0c;要提高加班效率&#xff0c;实现 3 个人干 5 个人活&#xff0c;拿 4 个人的工资&#xff0c;要把员工当成家人一样看待&#xff0c;要对他们的健康幸福负责。 前面…...

ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题

编译之前一定要安装好必须的库&#xff0c;否则即使提示编译成功&#xff0c;调用opencv后也可能会有问题 sudo apt-get update sudo apt-get upgradesudo apt-get install -y g sudo apt-get install -y cmake sudo apt-get install -y make sudo apt-get install…...

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…...

python中执行mysql操作并将python脚本共享

mysql下载路径&#xff1a; ​​​​​​MySQL :: MySQL Community Downloads [root2 ~]# vim py001.py a3 b4 print(ab) print(a**2b**2) [root2 ~]# python py001.py 7 25 [root2 ~]# python3 >>> import random >>> random <module rando…...

HTTP、HTTPS、SOCKS5三种协议特点

在互联网通信中&#xff0c;HTTP、HTTPS和SOCKS5是三种至关重要的协议&#xff0c;它们各自具有独特的特点和应用场景。本文将详细探讨这三种协议的特点&#xff0c;帮助读者更好地理解它们在网络通信中的作用。 一、HTTP协议特点 HTTP&#xff08;Hypertext Transfer Protoc…...

在ubuntu、centos、openEuler安装Docker

目录 ubuntu、centos、openEuler安装Docker 1.在 Ubuntu 上安装 Docker 1. 1 更新软件包 1. 2 安装必要的依赖 1.3 添加 Docker 的 GPG 密钥 1.4 添加 Docker 仓库 1.5 更新软件包 1.6 安装 Docker 1.7 启动并启用 Docker 服务 1.8 验证安装 1.9 运行测试容器 1.10…...

公共命名空间的例子3

有这样一个句子 用x语言解释[12*3]。 在x语言中&#xff0c;不符合“先乘除后加减”&#xff0c;这个句子应该怎样解释呢&#xff1f; 第一步&#xff0c;进行词法分析&#xff0c;目的是识别出注释和字符串&#xff0c;其中可能包括任意符号&#xff0c;干扰编译过程。 第二步…...

【云存储】SDS软件定义存储,数据存储的类型与技术方案(块/文件/对象,Ceph、RBD等)

【云存储】SDS软件定义存储&#xff0c;数据存储的类型与技术方案&#xff08;块/文件/对象&#xff0c;Ceph、RBD等&#xff09; 文章目录 1、分布式存储架构&#xff08;软件定义存储SDS&#xff0c;超融合基础架构HCI&#xff09;2、存储类型&#xff08;块存储&#xff0c;…...

第31课 Scratch入门篇:小画家(舞台上画画)

小画家(舞台上画画) 故事背景: 在舞台上选择画笔和颜色,进行画画 程序原理: 这节课我们继续练习画笔功能,通过画笔功能我们设计一个小画板,碰到哪种颜色画笔就切换成哪种颜色。 开始编程 1、绘制一大一小的黑色圆形,小的命名为画笔,大的圆形命名为black(黑色) 2、鼠…...

QT UI界面之ListView

文章目录 概述源码怎么用代码qt design 小结 概述 本来把布局文件那块写了一遍&#xff0c;但是看看都跟之前那篇差不多&#xff0c;就换了一个稍微有点难度的&#xff0c;也很常用的listview来写了。来看看&#xff0c;有什么好玩的。 源码 先看下源码&#xff0c;如下&…...

OpenClaw技能安装失败全解析:从依赖冲突到网络问题的系统性解决方案

1. 项目概述&#xff1a;当技能“卡住”时&#xff0c;我们遇到了什么&#xff1f;最近在折腾OpenClaw这类开源AI助手平台时&#xff0c;不少朋友都踩进了同一个坑&#xff1a;从官方市场或者第三方渠道找到了心仪的技能&#xff08;Skill&#xff09;&#xff0c;点击“安装”…...

Unity-MCP协议:可嵌入、可协商的AI上下文通信标准

1. 这不是又一个“AI插件”&#xff0c;而是Unity开发工作流的底层重定义你有没有过这样的时刻&#xff1a;在Unity里反复调整Animator Controller的过渡条件&#xff0c;只为让角色转身动画不穿模&#xff1b;写完一段NavMesh寻路逻辑&#xff0c;却要花两小时调试Agent卡在斜…...

软阴影:那个让虚拟世界“温柔起来“的光影小秘密

一、从一只小猫的影子说起 前几天我在朋友家做客&#xff0c;他家养了一只胖乎乎的橘猫&#xff0c;正趴在阳台的窗边晒太阳。我无意间瞥了一眼那只猫脚边的影子&#xff0c;突然被一个细节震撼了—— 那只猫的影子——并不是一片均匀的黑。 仔细看——猫肚子紧贴地板的地方——…...

政企数据安全:危机与出路

随着数字化转型的浪潮席卷全球&#xff0c;公共部门积累的数据量呈爆炸式增长。从公民个人信息到公共服务记录&#xff0c;从财政预算到基础设施管理数据——这些宝贵资源在提升政府治理效率的同时&#xff0c;也悄然成为网络犯罪分子的“新猎物”。当公共数据逐渐成为数字时代…...

echarts中heatmap鼠标滚动禁用缩放,向下滚动

配置如下效果如下...

炉石传说自动对战助手:5分钟上手,彻底解放双手的终极指南

炉石传说自动对战助手&#xff1a;5分钟上手&#xff0c;彻底解放双手的终极指南 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为每天重复的炉石…...

Owl-Alpha 新手快速上手指南

在处理大规模数据或构建高性能应用时&#xff0c;我们常常会遇到一个棘手的问题&#xff1a;如何在不阻塞主线程的情况下&#xff0c;高效地执行耗时任务&#xff1f;无论是处理图像、解析大型文件&#xff0c;还是进行复杂的数学运算&#xff0c;传统的单线程模式往往会让界面…...

告别混乱绑定!在UE5 GAS中优雅管理技能输入(基于GameplayTag)

告别混乱绑定&#xff01;在UE5 GAS中优雅管理技能输入&#xff08;基于GameplayTag&#xff09;当你的UE5 RPG项目发展到中期&#xff0c;技能数量从十几个膨胀到几十个时&#xff0c;最痛苦的莫过于发现InputAction绑定已经变成一团乱麻。每次新增技能都要修改输入绑定逻辑&a…...

HarmonyOS 6学习:解决图片放大后无法移动至边缘的matrix4矩阵变换技巧

从"卡在中间"到"自由拖拽"&#xff1a;一次完整的图片缩放平移边界问题攻关在HarmonyOS 6应用开发中&#xff0c;我最近遇到了一个看似简单却让人头疼的图片查看器问题&#xff1a;用户双指放大图片后&#xff0c;想要拖动查看边缘细节&#xff0c;却发现图…...

ZMJS,把 JavaScript 解释器放进 SAP ABAP 应用服务器之后,很多扩展思路会变得不一样

我今天看这个 oisee/zmjs 仓库时,最吸引人的不是它把 JavaScript 语法做进了 ABAP,而是它选择了一条非常 SAP 的路线,纯 ABAP、无外部依赖、无 Kernel Module、以类和接口的形式运行在 SAP 应用服务器内部。仓库自己的定位很直接,ZMJS 是一个面向 SAP ABAP 的 Mini JavaScr…...