【c++】继承
目录
一、继承的表现
子类对父类成员的访问权限
二、父类与子类之间的相互赋值
三、继承的作用域
如果是父类和子类构成隐藏呢?
四、子类的成员函数怎么写
1.default构造函数
2.析构函数
所以析构函数不需要我们显式调用。
五、继承与友元函数
六、继承与静态成员
七、菱形继承
八、虚基表
继承是c++对于类复用的重要特性,与之前写过的对于函数代码的复用相似。
一、继承的表现
class A
{
public:int _a;
};class B:public A
{
public:int _b;
};class C :public A
{
public:int _c;
};
在这个关系中,类B和类C都继承了类A,且均为public继承。
子类对父类成员的访问权限
无论是哪种继承,子类均能够完全继承父类的成员,但是访问权限不同。
继承方式影响的是类外通过子类访问父类的权限
public:子类可以访问,类外也可以访问
protected:子类可以访问,但是类外不能访问
private:子类和类外均不能访问
二、父类与子类之间的相互赋值
因为子类是从父类得到东西,并且加上了自己的东西,那么子类的成员是要比父类的多的,所以可得:子类可以赋值给父类,并且子类多的那一部分东西不会给父类,这个操作叫做切片。
class A
{
public:int _a;
};class B:public A
{
public:B(const int& b = 0):_b(b){}int _b;
};

在这里我没有给类A实现他的默认构造函数。
创建了一个b对象,b中有两个成员,一个是类A,一个是_b,类A中有成员_a, 相当于b中有_a和_b。
可以看到,b中的成员在给a进行赋值的时候并不会出错,只是把b的父类有的东西赋值给了a。
三、继承的作用域
在父类和子类中是允许出现两个相同名字的成员的,这种关系叫做隐藏,也叫重定义。
class Parent
{
public:Parent():_num(0),_parent(0){cout << "Parent()" << endl;}~Parent(){_num = _parent = 0;cout << "~Parent()" << endl;}int _num;int _parent;
};class Child1:public Parent
{
public:int _child;
};class Child2 :public Parent
{
public:int _child;
};
在这个关系中,类child1和类child2都有共同的成员变量_child,构成隐藏关系。
在进行访问时,互不干扰。
这是位于同一层的关系,他们都是父类的子类。(辈分相同)
如果是父类和子类构成隐藏呢?

可知是由于就近原则的关系,直接对于c3的同名成员变量进行操作是在给c3的成员继续赋值。
如果要访问父类的同名成员需要加上作用域限定符:

四、子类的成员函数怎么写
1.default构造函数
子类包含有父类的成员,在子类进行构造的时候,先调用父类的构造函数,然后才会调用自己的构造函数。
在子类进行析构的时候,先调用自己的析构函数后才会调用父类的析构函数。(后创建的先销毁)

显示调用的原因是我没有写Parent类的默认构造函数。

2.析构函数

他会先调用自己的析构函数后去调用父类的析构函数。
没写父类析构函数,也没有显示调用:

没写父类析构函数,显示调用:


写析构,显示调用:


因为在显示调用时候父类资源已经被释放,但是在子类的析构函数结束时,它会自动再调用一次父类的析构函数,所以出现内存问题。
所以析构函数不需要我们显式调用。
五、继承与友元函数
父类的友元函数并不是子类的友元函数,友元函数一向如此。
六、继承与静态成员
静态成员在子类中也存在,和父类的是同一个东西。
七、菱形继承
继承关系呈现菱形的继承是菱形继承,也即:一个父类有多个子类,一个孙子类继承了多于两个的子类,此时就构成了菱形继承。
菱形继承会造成很多不必要的麻烦:比如数据冗余和二义性。
数据冗余是指在父类和子类中都会存在相同的一个父类。
二义性是指在孙子类中访问父类的成员时不知道访问的是谁的。
因为两个子类中都存在这个父类的成员。
需要加上作用域限定符:
但其实我们想要的是一块空间存储类A就行了,所以加上关键字virtual使其成为虚继承:


这样就解决了数据冗余的问题,也解决了二义性的问题:

八、虚基表

观察内存窗口我们可以发现父类A的成员存在了类D的后面,不属于任何类。

由继承关系可以知道,在d的内存空间中,是严格按照继承顺序来排列的,先是b的空间,再是c的空间,再是d自己的空间,最后是公共的空间用来存放父类。
由内存窗口可以知道,分别有两个字节的空间不是存放子类的数据的,这两个字节的数据就是虚基表,用来存放当前地址到父类(公共空间)的距离,不然会找不到这块地址的。
由于虚基表的存在,每个类也都不是本来类型之和的大小了。

不加virtual关键字的情况:
sizeof(D) = (A的大小)sizeof(int)*2 + (B的大小)sizeof(int)*2 + (D的一个成员)sizeof(int) = 20
所以多出来的12个字节用来存放虚基表。
相关文章:
【c++】继承
目录 一、继承的表现 子类对父类成员的访问权限 二、父类与子类之间的相互赋值 三、继承的作用域 如果是父类和子类构成隐藏呢? 四、子类的成员函数怎么写 1.default构造函数 2.析构函数 所以析构函数不需要我们显式调用。 五、继承与友元函数 六、继承与静…...
minio安装配置和使用(二)客户端安装
安装minio客户端mcli 命令如下: dnf install https://dl.minio.org.cn/client/mc/release/linux-amd64/mcli-20230128202938.0.0.x86_64.rpm 安装完成,在/usr/local/bin/下新增了mcli命令 mcli是对minio进行管理的命令。功能丰富, 基本格式…...
【如何使用Arduino设置GRBL和控制CNC机床】
【如何使用Arduino设置GRBL和控制CNC机床】 前言1. 什么是GRBL?2. 所需硬件3. 如何安装GRBL4. GRBL 配置5. GRBL 控制器5.1 如何使用通用 G 代码发送器5.2 波特率5.3 电机方向5.4 步进比例系数5.5 限位开关5.6 数控机床的归位设置6. 结论前言 如果您正在考虑或正在制造自己的…...
项目测试——博客系统
文章目录项目测试——博客系统项目简介项目功能测试计划web自动化测试1. 测试用例2.web自动化测试说明项目测试——博客系统 项目简介 博客系统主要分为8大模块,分别是注册页,登录页,编辑页,修改页,个人主页…...
【C习题】经典数组与指针面试题(万字)
文章目录一. 一维数组二.字符数组三.字符指针四.二维数组五.指针笔试题一. 一维数组 首先说明:需熟记以下三个规则。 规则1.&数组名指的是取出整个数组的地址。 规则2.数组名被单独放在sizeof内部,计算的是整个数组的大小。 说明:这里的单…...
【ArcGIS Pro二次开发】(13):ProWindow的用法
ProWindow是ArcGIS Pro SDK中的一个WPF控件,具有以下特点: 可扩展性:ProWindow提供了丰富的API和样式,可以轻松地扩展和自定义ArcGIS Pro应用程序的UI。 可定制性:ProWindow支持多种UI控件和布局方式,可以…...
HTML/CSS/JS 基本语法
前端一、HTNL1、文件结构2、文本标签(1)块元素:div(2)行内元素:span(3)格式标签3、图片、音频、视频(1)图片(2)音频< audio >&a…...
对于从事芯片行业的人来说,有哪些知识是需要储备的?
近两年芯片行业大火,不少同学想要转行,却不知道该如何下手,需要学习哪些基础知识,下面就来看看资深工程师怎么说? 随着工艺的发展,芯片肯定是尺寸越来越小,至于小到什么样的程度是极限…...
测试场景设计
测试场景设计 又叫做场景法。其实对于场景法是测试用例中面临最多的,但是这种模式不是很容易总结,有时候是基于经验,有时候是我们对系统的了解。所以在这种情况下,我们强硬的用场景法对其进行规范。 场景法原理 现在的软件几乎…...
《重构》增强代码可读性
文章目录重构原则何为重构为何重构何时重构重构会影响性能吗实例原始类进行重构分解statements方法提取函数搬移函数提炼“积分计算”功能去除临时变量(以查询取代临时变量)运用多态取代与价格相关的条件逻辑代码迁移Movie类Price类 状态模式搬移函数以多…...
数据分析自学路线
数据分析作为近几年火起来的IT技术岗位,在大数据时代的浪潮下迅速发酵膨胀,席卷了众多互联网企业,漫延到了金融、教育、医疗、消费等传统行业,在新经济领域也有重要作用,比如人工智能、新能源、电子芯片、企业数字化服…...
蓝桥杯C++组怒刷50道真题
🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 50题才停更,课业繁忙,有时间就更,2023/3/14/15:06写下 目录 👊填空题 🌼一…...
【期末小作业】HTML、CSS前端静态网页
分享一个可以“趁别人喝咖啡的功夫“”写的一个静态网页,纯纯练手小项目,适合前端刚入门的小白练练手。 前端练手静态页面 实现效果图展示 CSS代码 HTML 代码 环境:VScode编辑器 语言:HTML 、CSS 一、实现效果图 仅仅通过…...
Windows逆向安全(一)之基础知识(二)
反汇编分析C语言 空函数反汇编 #include "stdafx.h"//空函数 void function(){}int main(int argc, char* argv[]) {//调用空函数function();return 0; }我们通过反汇编来分析这段空函数 函数外部 12: function(); 00401048 call ILT5(func…...
Python 基础教程【2】:条件语句和循环语句
本文已收录于专栏🌻《Python 基础》文章目录1、流程控制语句1.1 顺序语句1.2 条件语句1.2.1 if语句注意事项1.2.2 三元运算符1.2.3 自动类型转换1.3 循环语句1.3.1 while 循环1.3.2 for-in 循环1.3.3 for...else 循环1.3.4 break 和 continue 的区别2、实践——猜数…...
【React避坑指南】useEffect 依赖引用类型
前言 如果你是一个入行不久的前端开发,面试中多半会遇到一个问题: 你认为使用React要注意些什么? 这个问题意在考察你对React的使用深度,因为沉浸式地写过一个项目就会发现,不同于一些替你做决定的框架,“…...
Android binder通信实现进程间通信
一.binder通信原理Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。在 Binder 机制中,…...
2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒
目录 前言:简介 一、什么是.halo勒索病毒? 二、.halo勒索病毒是如何传播感染的? 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复? 五、加密数据恢复情况 六、系统安全防护措施建…...
【LeetCode】BM1 反转链表、NC21 链表内指定区间反转
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 BM1 反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,…...
拼多多24届暑期实习真题
1. 题目描述: 多多开了一家自助餐厅,为了更好地管理库存,多多君每天需要对之前的课流量数据进行分析,并根据客流量的平均数和中位数来制定合理的备货策略。 2. 输入输出描述: 输入描述: 输入共两行&#x…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...



