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

<C++>【继承篇】

 

✨前言✨

🎓作者:【 教主 】

📜文章推荐:

☕博主水平有限,如有错误,恳请斧正。

📌机会总是留给有准备的人,越努力,越幸运!

💦导航助手💦


什么是继承?

继承是面向对象编程的三大特性之一,是一种使代码得以复用的重要手段。使程序员可以在已有类的基础上进行拓展,产生新的类,已有类称为基类或父类,新的类称为派生类或子类。

class Person
{
public:int age;string name;
};
class Student:public Person
{
public:int stuId;
};

继承的书写格式:class 子类:继承方式 父类

继承方式

  • public继承
  • protected继承
  • private继承

不同的继承方式在子类中的基类成员访问方式不同

总结:

  •  无论是哪种继承方式,基类中的私有成员在子类中都是不可以访问的
  • 继承方式可以省略,class默认继承是private,struct默认继承是public,但是为了代码的可读性,建议写上继承方式
  • 一般都用public继承,很少用其他两种方式继承

继承中的一些问题

切片

将子类对象赋值给父类对象/父类指针/父类引用就叫做切片,顾名思义,就是把子类中继承自父类的那一部分切出来赋值。

赋值完成后父类对象/父类指针/父类引用就只保留属于父类的那一部分

注意:子类可以赋值给父类,但是父类不能赋值给子类

继承的隐藏规则

规则:如果父类与子类定义了同名变量或者同名函数,那么子类在访问该变量或者函数时默认访问的是子类的,而不是父类的,如果要访问子类对象中继承来自父类的同名变量或者同名函数需要指定父类作用域。

举例:类A有成员变量num,成员函数print(),类B继承类A,类B定义同名变量num,同名函数print()

代码如下:

class A
{
public:int num;void print(){cout << "A::print()" << endl;}
};class B :public A
{
public:int num;void print(){cout << "B::print()" << endl;}
};int main()
{B b;//访问b中的变量num与print()b.num = 10;cout << b.num << endl;b.print();//访问b中继承自A的变量num与print()b.A::num = 20;cout << b.A::num << endl;b.A::print();return 0;
}

 代码运行结果如下:

注意:这不是函数重载!函数重载是在同一个作用域内函数名相同而参数不同,这是隐藏,是两个作用域。

默认成员函数

  • 子类构造函数必须调用父类构造函数来初始化继承自父类的部分,如果父类没有默认构造,必须在子类构造函数初始化列表中显式调用父类构造来初始化
  • 拷贝构造与赋值重载也必须调用父类的来完成
  • 析构函数中子类完成清理工作后会自动调用父类析构,不用显式调用父类析构

构造与析构顺序

构造:父类先构造,子类后构造

析构:子类先析构,父类后析构

举例代码如下:

class A
{
public:A(){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}
};
class B :public A
{
public:B(){cout << "B()" << endl;}~B(){cout << "~B()" << endl;}
};
int main()
{B b;return 0;
}

运行结果如下:

静态成员

整个继承体系中只有一个static成员,无论怎样继承只有一份。

菱形继承

什么是菱形继承?

菱形继承,也叫做钻石继承,因为形状像菱形,所以叫做菱形继承。

class A
{
public:int a;
};class B1 :public A
{};class B2 :public A
{};class C :public B1, B2
{};

有一类A,A中有一个数据成员a,类B1和类B2公有继承类A,所以B1和B2中都有数据成员a,类C公有继承B1和B2,这时候类C中就有两份数据成员a,一份来自B1,一份来自B2,这就造成了数据冗余。并且在访问C对象访问a时会造成二义性。

如何解决菱形继承?

解决菱形继承需要使用虚继承。B1和B2虚继承A,继承时加上关键字virtual,代码如下。

class A
{
public:int a;
};class B1 :virtual public A
{};class B2 :virtual public A
{};class C :public B1, B2
{};

这样即可解决菱形继承的代码冗余以及二义性问题。无论是指定作用域访问还是默认访问,访问的都是同一个变量a。

可能有人问:为什么C++要设计这么复杂的继承机制,不像java一样,不支持多继承不就解决这样复杂的问题了吗?

在我的博客:深度剖析菱形继承 中,深度解析了菱形继承的细节问题,感兴趣的朋友可以自行阅读。

C++作为比较早期的面向对象的编程语言,属于是摸着石头过河,所以有缺陷也是可以理解的。

欢迎关注,码字不易,希望多多点赞、收藏哦!抱拳了。

相关文章:

<C++>【继承篇】

​ ✨前言✨ &#x1f393;作者&#xff1a;【 教主 】 &#x1f4dc;文章推荐&#xff1a; ☕博主水平有限&#xff0c;如有错误&#xff0c;恳请斧正。 &#x1f4cc;机会总是留给有准备的人&#xff0c;越努力&#xff0c;越幸运&#xff01; &#x1f4a6;导航助手&#x1…...

size_t 和double相乘怎么转换size_t

在C中&#xff0c;size_t和double可以直接相乘&#xff0c;结果会自动转换为double类型。如果你想要得到的结果是size_t类型&#xff0c;你需要进行显式类型转换。但是要注意&#xff0c;double转size_t可能会丢失小数部分&#xff0c;只保留整数部分。 以下是一个例子&#x…...

C# 的一些好用的语法糖介绍

C# 中有很多语法糖&#xff08;Syntactic sugar&#xff09;&#xff0c;它们是一些语言特性&#xff0c;使得编写代码更加简洁、易读、更具表现力。 Lambda 表达式&#xff1a; Lambda 表达式允许你编写简洁的匿名函数。例如&#xff1a; Func<int, int, int> add (a…...

驱动开发面试复习

创建字符设备 1 创建设备号 alloc_chrdev_region 2.创建cdev cdev_init 3.添加一个 cdev,完成字符设备注册到内核 cdev_add 4.创建类 class_create 5.创建设备 device_create 1.内核空间与用户空间数据 copy_from_user 和copy_to_user 俩个函数来完成。 copy_from_user 函数…...

监测数据计算与换算:确保工程安全的关键步骤

在工程项目中&#xff0c;监测数据的计算与换算是一项至关重要的工作&#xff0c;它直接关系到工程的安全与稳定。本文将从确定基准值、数据计算与换算、异常值处理以及数据存储等方面&#xff0c;探讨监测数据计算与换算的主要工作内容。 添加图片注释&#xff0c;不超过 140 …...

Vue项目实战--空间论坛(1)

环境准备 安装好node.js,Vue后 添加插件 router---路由&#xff0c;多页面的应用 vuex---在多个组件之间维护同一个数据 添加依赖 bootstrap---美工 popperjs/core vue项目介绍 views-----对应vue文件&#xff0c;页面 router-----路由&#xff0c;页面&#xff0c;c…...

linux内核驱动——字符设备实现两个终端单向收发

linux内核驱动——字符设备实现两个终端单向收发 参考 Ubuntu18.04添加内核模块&#xff08;字符设备&#xff09; 创建内核驱动文件chat_dev.c&#xff1a; #include <linux/init.h> //定义了module_init #include <linux/module.h> //最基本的头文件&a…...

读取CSV数据并写入MySQL

import pandas as pd #import tushare as ts from sqlalchemy import create_engineimport baostock as bs #### 登陆系统 #### lg bs.login() # 显示登陆返回信息 print(login respond error_code:lg.error_code) print(login respond error_msg:lg.error_msg) #### 获取沪深…...

centos7.4下升级最新的ssh

一 安装telnet服务器 安装telnet服务器目的&#xff0c;防止我们升级失败的时候&#xff0c;可以通过telnet登录&#xff0c;而不至于上机房。 由于我们是临时启动&#xff0c;所以只要简单的使用&#xff0c;不要通过xinetd来进行守护。 命令如下&#xff1a; yum -y install …...

Java实现的双向链表示例

双向链表&#xff08;Doubly Linked List&#xff09;是一种链式数据结构&#xff0c;每个节点都包含两个指针&#xff0c;一个指向前一个节点&#xff0c;一个指向后一个节点。双向链表与单向链表相比&#xff0c;除了有前向指针外&#xff0c;还有一个额外的后向指针&#xf…...

生物电信号测量技术

引言 生物电信号是生物体内的电活动产生的电流或电压信号&#xff0c;它反映了生物体的生理状态和活动。生物电信号测量技术是一种用于记录和分析这些信号的方法&#xff0c;广泛应用于医学、生物学、神经科学等领域。本文将介绍几种常见的生物电信号测量技术&#xff0c;并讨…...

【开源】JAVA+Vue.js实现创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…...

Python基于opencv的人脸识别上课签到考勤系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

【HTML】HTML基础7.2(有序列表)

目录 标签 效果 注意 标签 <ol> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> <li>列表内容</li> 。。。。。。 </ol> 效果 代码 <ol><li>银河护卫队 10000000000</li><l…...

ucode usage使用方法

需结合代码和main函数的命令行去快速理解该库&#xff1b; main.c 和example中的代码示例 源代码的地址&#xff1a;https://github.com/jow-/ucode.git 翻译地址&#xff1a;https://github.com/jow-/ucode/blob/master/docs/tutorials/01-usage.md ucode命令行提供了一系列的…...

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二习题三&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享…...

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…...

oss-fuzz-gen:一款基于LLM的模糊测试对象生成与评估框架

关于oss-fuzz-gen oss-fuzz-gen是一款基于LLM的模糊测试对象生成与评估框架&#xff0c;该工具可以帮助广大研究人员使用多种大语言模型&#xff08;LLM&#xff09;生成真实场景中的C/C项目以执行模糊测试。 该工具基于Google的OSS-Fuzz平台实现其功能&#xff0c;并对生成的…...

深度神经网络 基本知识 记录

资料&#xff1a;https://www.bilibili.com/video/BV1K94y1Z7wn/?spm_id_from333.337.search-card.all.click&vd_source14a476de9132ba6b2c3cbc2221750b99 计划&#xff1a;3~4天 杂 人工智能包括ML&#xff0c;ML包括DL机器学习需要人工大量参与&#xff0c;DL模拟人的…...

基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)

一、注册阿里云账户 打开https://www.aliyun.com/&#xff0c;申请阿里云账户并完成实名认证&#xff08;个人&#xff09;。这种情况就是完成了&#xff1a; 二、开通OSS服务 点击立即开通即可。 三、创建Bucket 申请id和secert&#xff1a; 进去创建一个Accesskey就会出现以…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...