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

【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++】继承

目录 一、继承的表现 子类对父类成员的访问权限 二、父类与子类之间的相互赋值 三、继承的作用域 如果是父类和子类构成隐藏呢&#xff1f; 四、子类的成员函数怎么写 1.default构造函数 2.析构函数 所以析构函数不需要我们显式调用。 五、继承与友元函数 六、继承与静…...

minio安装配置和使用(二)客户端安装

安装minio客户端mcli 命令如下&#xff1a; dnf install https://dl.minio.org.cn/client/mc/release/linux-amd64/mcli-20230128202938.0.0.x86_64.rpm 安装完成&#xff0c;在/usr/local/bin/下新增了mcli命令 mcli是对minio进行管理的命令。功能丰富&#xff0c; 基本格式…...

【如何使用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大模块&#xff0c;分别是注册页&#xff0c;登录页&#xff0c;编辑页&#xff0c;修改页&#xff0c;个人主页&#xf…...

【C习题】经典数组与指针面试题(万字)

文章目录一. 一维数组二.字符数组三.字符指针四.二维数组五.指针笔试题一. 一维数组 首先说明&#xff1a;需熟记以下三个规则。 规则1.&数组名指的是取出整个数组的地址。 规则2.数组名被单独放在sizeof内部&#xff0c;计算的是整个数组的大小。 说明&#xff1a;这里的单…...

【ArcGIS Pro二次开发】(13):ProWindow的用法

ProWindow是ArcGIS Pro SDK中的一个WPF控件&#xff0c;具有以下特点&#xff1a; 可扩展性&#xff1a;ProWindow提供了丰富的API和样式&#xff0c;可以轻松地扩展和自定义ArcGIS Pro应用程序的UI。 可定制性&#xff1a;ProWindow支持多种UI控件和布局方式&#xff0c;可以…...

HTML/CSS/JS 基本语法

前端一、HTNL1、文件结构2、文本标签&#xff08;1&#xff09;块元素&#xff1a;div&#xff08;2&#xff09;行内元素&#xff1a;span&#xff08;3&#xff09;格式标签3、图片、音频、视频&#xff08;1&#xff09;图片&#xff08;2&#xff09;音频< audio >&a…...

对于从事芯片行业的人来说,有哪些知识是需要储备的?

近两年芯片行业大火&#xff0c;不少同学想要转行&#xff0c;却不知道该如何下手&#xff0c;需要学习哪些基础知识&#xff0c;下面就来看看资深工程师怎么说&#xff1f; 随着工艺的发展&#xff0c;芯片肯定是尺寸越来越小&#xff0c;至于小到什么样的程度是极限&#xf…...

测试场景设计

测试场景设计 又叫做场景法。其实对于场景法是测试用例中面临最多的&#xff0c;但是这种模式不是很容易总结&#xff0c;有时候是基于经验&#xff0c;有时候是我们对系统的了解。所以在这种情况下&#xff0c;我们强硬的用场景法对其进行规范。 场景法原理 现在的软件几乎…...

《重构》增强代码可读性

文章目录重构原则何为重构为何重构何时重构重构会影响性能吗实例原始类进行重构分解statements方法提取函数搬移函数提炼“积分计算”功能去除临时变量&#xff08;以查询取代临时变量&#xff09;运用多态取代与价格相关的条件逻辑代码迁移Movie类Price类 状态模式搬移函数以多…...

数据分析自学路线

数据分析作为近几年火起来的IT技术岗位&#xff0c;在大数据时代的浪潮下迅速发酵膨胀&#xff0c;席卷了众多互联网企业&#xff0c;漫延到了金融、教育、医疗、消费等传统行业&#xff0c;在新经济领域也有重要作用&#xff0c;比如人工智能、新能源、电子芯片、企业数字化服…...

蓝桥杯C++组怒刷50道真题

&#x1f33c;深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 &#x1f33c;多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 50题才停更&#xff0c;课业繁忙&#xff0c;有时间就更&#xff0c;2023/3/14/15:06写下 目录 &#x1f44a;填空题 &#x1f33c;一…...

【期末小作业】HTML、CSS前端静态网页

分享一个可以“趁别人喝咖啡的功夫“”写的一个静态网页&#xff0c;纯纯练手小项目&#xff0c;适合前端刚入门的小白练练手。 前端练手静态页面 实现效果图展示 CSS代码 HTML 代码 环境&#xff1a;VScode编辑器 语言&#xff1a;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】:条件语句和循环语句

本文已收录于专栏&#x1f33b;《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 依赖引用类型

前言 如果你是一个入行不久的前端开发&#xff0c;面试中多半会遇到一个问题&#xff1a; 你认为使用React要注意些什么&#xff1f; 这个问题意在考察你对React的使用深度&#xff0c;因为沉浸式地写过一个项目就会发现&#xff0c;不同于一些替你做决定的框架&#xff0c;“…...

Android binder通信实现进程间通信

一.binder通信原理Binder 是 Android 系统中用于跨进程通信的一种机制&#xff0c;它允许一个进程中的组件与另一个进程中的组件进行通信&#xff0c;从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。在 Binder 机制中&#xff0c;…...

2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒

目录 前言&#xff1a;简介 一、什么是.halo勒索病毒&#xff1f; 二、.halo勒索病毒是如何传播感染的&#xff1f; 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复&#xff1f; 五、加密数据恢复情况 六、系统安全防护措施建…...

【LeetCode】BM1 反转链表、NC21 链表内指定区间反转

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 BM1 反转链表 描述&#xff1a; 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;…...

拼多多24届暑期实习真题

1. 题目描述&#xff1a; 多多开了一家自助餐厅&#xff0c;为了更好地管理库存&#xff0c;多多君每天需要对之前的课流量数据进行分析&#xff0c;并根据客流量的平均数和中位数来制定合理的备货策略。 2. 输入输出描述&#xff1a; 输入描述&#xff1a; 输入共两行&#x…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...