【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…...
构建高可用Chatbot UI完整模板:从架构设计到生产环境部署
痛点分析:Chatbot UI开发中的那些“坑” 在动手开发一个Chatbot UI之前,我们得先聊聊那些让开发者头疼的常见问题。如果你做过类似项目,下面这些场景一定不陌生: 状态管理失控:对话历史、用户输入、AI回复状态、连接…...
【C++ 多线程实战精讲】std::thread 线程创建 / 传参 / 同步 / 智能指针 / 生命周期管理
前言C11 正式推出了标准多线程库 <thread>,让跨平台多线程开发变得简单高效。但多线程的坑非常多:线程传参、对象生命周期、数据竞争、锁使用、指针悬空、析构崩溃……本文基于完整可运行工程代码,带你彻底掌握:线程创建、j…...
深入解析Bluetooth AVDTP协议:音频/视频传输的核心机制
1. 蓝牙AVDTP协议初探:音频视频传输的幕后英雄 每次用蓝牙耳机听音乐或看视频时,你可能没意识到背后有个"隐形交通警察"在指挥数据流动。这个默默工作的角色就是AVDTP协议(Audio/Video Distribution Transport Protocol)…...
保姆级教程:用InVEST 3.14.0中文版搞定毕业论文碳储量计算(附数据预处理避坑指南)
零基础科研实战:InVEST碳储量计算全流程精解与避坑指南 刚接触InVEST模型的新手研究者,往往会在碳储量计算的第一步就陷入数据沼泽——为什么我的土地利用数据无法加载?为什么运行结果出现负值?这些看似简单的操作背后,…...
别再只盯着蓝牙和ZigBee了!用Telink TLSR8258芯片的2.4G私有协议,自己动手做个低功耗遥控器
从零构建2.4G私有协议遥控器:Telink TLSR8258实战指南 当市面上大多数IoT设备还在蓝牙和ZigBee的框架下挣扎时,Telink TLSR8258芯片的2.4G私有协议正在悄然改写低功耗无线通信的规则。我曾在一个智能农业项目中,需要控制200米外的灌溉阀门&am…...
嵌入式NMEA-0183零内存分配解析器设计与实现
1. NMEA-0183 协议解析库深度技术解析:面向嵌入式系统的轻量级、零内存分配实现 NMEA-0183(National Marine Electronics Association 0183)是全球航海电子设备事实上的标准通信协议,自1983年发布以来,已广泛应用于GPS…...
ollama-QwQ-32B微调实践:优化OpenClaw技术文档理解能力
ollama-QwQ-32B微调实践:优化OpenClaw技术文档理解能力 1. 为什么需要微调大模型理解技术文档? 去年冬天,我在用OpenClaw自动化处理技术文档时遇到了一个尴尬场景:当我让AI助手"整理OpenClaw的403错误解决方案"时&…...
ChatTTS一键集成实战:从语音合成到高效部署的完整指南
最近在做一个需要语音播报功能的小项目,一开始觉得语音合成嘛,不就是调个API的事。结果真上手才发现,从选型、集成到上线,坑是一个接一个。延迟高、资源占用大、并发一上来就崩……这些问题让我头疼了好久。直到尝试了ChatTTS的“…...
LED点阵驱动库LEDMatrix:嵌入式硬件时序控制实战指南
1. LEDMatrix 库概述:面向硬件驱动的二维点阵控制框架LEDMatrix 是一个专为嵌入式系统设计的轻量级 C 语言库,核心目标是将抽象的二维布尔数组(bool matrix[rows][cols])高效、可靠地映射至物理 LED 点阵屏。其设计哲学并非通用图…...
3个维度解析Outfit字体:构建跨平台设计系统的开源解决方案
3个维度解析Outfit字体:构建跨平台设计系统的开源解决方案 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts 在数字化设计领域,字体作为视觉传达的核心元素,直接…...



