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.是什么? C 中的继承是类与类之间的关系,与现实世界中的继承类似 例如:儿子继承父亲的财产 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如: 类B继承…...
Node.JS - 基础(Express)
目录 A. 简介 B. 下载,安装 C. 启动服务,查看文件结构 A. 简介 Express 是一个基于 Node.js 平台的极简、灵活的 Web 应用开发框架,它提供了一系列强大的功能来构建 Web 应用程序和 API。 一、Express 的基本特点 简洁的路由系统: Express 的路由系…...
I/O复用
I/O复用使得程序能够同时监听多个文件描述符,这对提高程序的性能至关重要。 举个例子: 就好比你天天玩手机,你妈为了监控你,在你房间安装了一个监控,这个监控可以实时监控你的一举一动,并上传到你妈手机上…...
【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题
目录 背景一. 报错信息1.1 报错的图片信息1.2 报错的文字信息 二. 解决报错2.1 下载 NetFx3.cab 文件2.2 执行命令 三. SQL Server 修复安装 背景 一次在阿里云服务器安装 SQL Server 2012时,系统报错了,导致安装进行不下去…通过在网上查找了多种解决方…...
STM32的SDIO接口详解
目录 1. 定义与兼容性 2. SDIO时钟 3. SDIO命令与响应 4. SDIO块数据传输 5. SDIO控制器的硬件结构 6.代码实现 1.SD初始化 2.测试SD卡的读取 3.测试SD卡的写入 STM32的SDIO(Secure Digital Input/Output,安全数字输入输出)接口是一…...
docker容器常用指令,dockerfile
docker:容器,主要是解决环境迁移的问题,将环境放入docker中,打包成镜像。 docker的基本组成:镜像(image),容器(container),仓库(repository)。镜像相当于类,容器相当于类的实例对象…...
C语言学习笔记 Day11(指针--下)
Day11 内容梳理: 目录 Chapter 7 指针 7.6 指针 & 函数 (1)形参改变实参的值 (2)字符数组作为函数参数 1)合并字符串 2)删掉字符串中空格 (3)指针作为函数返…...
(24)(24.2) Minim OSD快速安装指南(二)
文章目录 前言 6 MinimOSD-extra NG 7 替代硬件 前言 本文简要介绍了如何连接电路板。有关更多详细说明,请参阅 MinimOSD 项目维基(MinimOSD Project wiki)。 6 MinimOSD-extra NG 该项目位于此处(here);文档位于此处(here);支撑线位于此…...
GD32 MCU碰到IIC总线卡死怎么办?
大家在使用MCU IIC通信时,若碰到设备复位或者总线干扰等情况,可能会导致IIC总线卡死,表现上总线上SDA或者SCL其中一根线为低电平,IIC总线一直处于busy状态。此时若代码上一直等待总线空闲,则可能导致软件死机ÿ…...
算法——动态规划:0/1 背包问题
文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组6.1 两行实现6.2 单行实现6.3 优缺点 三、总结 一、问题描述 问题的抽象:给定 n n n 种物品和一个背包,第 i i i 个物品的体积为 c i c_i …...
又是奇瑞,“统一下班时间”过去不久,最近又整新活了...
奇瑞 345 345 可不是奇瑞的汽车型号,而是奇瑞 7 月份会议文章中提出的新策略。 简单来说,要提高加班效率,实现 3 个人干 5 个人活,拿 4 个人的工资,要把员工当成家人一样看待,要对他们的健康幸福负责。 前面…...
ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题
编译之前一定要安装好必须的库,否则即使提示编译成功,调用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实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间,根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计,前提是主播名称唯一…...
python中执行mysql操作并将python脚本共享
mysql下载路径: 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三种协议特点
在互联网通信中,HTTP、HTTPS和SOCKS5是三种至关重要的协议,它们各自具有独特的特点和应用场景。本文将详细探讨这三种协议的特点,帮助读者更好地理解它们在网络通信中的作用。 一、HTTP协议特点 HTTP(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语言中,不符合“先乘除后加减”,这个句子应该怎样解释呢? 第一步,进行词法分析,目的是识别出注释和字符串,其中可能包括任意符号,干扰编译过程。 第二步…...
【云存储】SDS软件定义存储,数据存储的类型与技术方案(块/文件/对象,Ceph、RBD等)
【云存储】SDS软件定义存储,数据存储的类型与技术方案(块/文件/对象,Ceph、RBD等) 文章目录 1、分布式存储架构(软件定义存储SDS,超融合基础架构HCI)2、存储类型(块存储,…...
第31课 Scratch入门篇:小画家(舞台上画画)
小画家(舞台上画画) 故事背景: 在舞台上选择画笔和颜色,进行画画 程序原理: 这节课我们继续练习画笔功能,通过画笔功能我们设计一个小画板,碰到哪种颜色画笔就切换成哪种颜色。 开始编程 1、绘制一大一小的黑色圆形,小的命名为画笔,大的圆形命名为black(黑色) 2、鼠…...
QT UI界面之ListView
文章目录 概述源码怎么用代码qt design 小结 概述 本来把布局文件那块写了一遍,但是看看都跟之前那篇差不多,就换了一个稍微有点难度的,也很常用的listview来写了。来看看,有什么好玩的。 源码 先看下源码,如下&…...
构建仓库与包管理
一、构建仓库 1、nexus安装 brew安装方式(比较慢) brew install nexus官网下载安装方式 去sonatype官网下载,比如MacOS的,下载完成之后cd到bin目录即可看到启动命令 启动 # 2.0版本 brew services start nexus # 3.0版本 /usr…...
运维视角的测试:可观测性驱动的质量保障
在云原生与微服务架构盛行的今天,软件系统的复杂性已呈指数级增长。一个简单的用户请求,背后可能串联起数十个松耦合的服务,横跨多个云环境与基础设施层。传统的软件测试,其焦点往往集中于功能验证、性能基准测试与缺陷发现&#…...
为什么选择Smart AutoClicker:3分钟上手的安卓图像识别自动点击神器
为什么选择Smart AutoClicker:3分钟上手的安卓图像识别自动点击神器 【免费下载链接】Smart-AutoClicker An open-source auto clicker on images for Android 项目地址: https://gitcode.com/gh_mirrors/smar/Smart-AutoClicker 还在为重复的屏幕点击操作烦…...
玩转Python标准库:os与sys常用方法
目录 一、os与sys:Python与操作系统之间的翻译官 二、os模块:文件系统与进程管理 2.1 获取当前工作目录与路径拼接 2.2 创建、删除、重命名文件和目录 2.3 遍历目录:os.walk 2.4 执行系统命令:os.system vs subprocess 2.5…...
通俗秒懂:储能控制器在电网调频中的关键作用与实现原理
1. 电网调频的"急救科"与"内科":为什么需要储能控制器? 想象一下电网就像人体的血液循环系统。频率稳定相当于血压稳定,一旦出现波动,轻则头晕目眩(电能质量下降),重则危及…...
从Doorbell到RoCE包:深度解析RDMA Tx数据流的硬件协同
1. 从门铃到数据包:RDMA发送流程全景图 想象一下你在一家高级餐厅点餐的场景:服务员(CPU)把你的订单(WQE)写在厨房门口的订单板(SQ环形缓冲区)上,然后按一下服务铃&…...
仅限PHP 8.9.0–8.9.3可用!3个未公开的php.ini异步I/O隐藏参数及压测对比数据
第一章:PHP 8.9 异步 I/O 优化技巧概览PHP 8.9 并非官方发布的正式版本(截至 2024 年,PHP 最新稳定版为 8.3,8.4 处于 RC 阶段),因此本章所指的“PHP 8.9”为虚构技术演进场景,用于探讨未来 PHP…...
手把手教你用Arduino和BLE键盘库打造智能音乐控制器(附完整代码)
手把手教你用Arduino和BLE键盘库打造智能音乐控制器(附完整代码) 在智能家居和物联网项目蓬勃发展的今天,将物理按键与数字媒体控制相结合的需求日益增长。想象一下,只需轻触一个实体按钮就能切换音乐、调节音量,甚至无…...
拉普拉斯变换:从傅里叶到复频域的系统分析利器
1. 从傅里叶到拉普拉斯:为什么我们需要复频域? 第一次接触傅里叶变换时,你可能被它"时域转频域"的魔法惊艳到了——直到遇到一个尴尬问题:当信号不满足绝对可积条件时(比如指数增长的信号e^t)&am…...
蓝牙协议栈实战:从HCI命令到GATT服务,一个物联网设备的数据传输完整流程解析
蓝牙协议栈实战:从HCI命令到GATT服务的数据传输全链路剖析 当智能手环的心率数据通过手机App实时显示时,背后是蓝牙协议栈各层协同工作的精密舞蹈。本文将用真实开发场景中的抓包分析和代码示例,揭示一个物联网设备从物理层连接建立到应用层数…...
