当前位置: 首页 > 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就会出现以…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识&#xff0c;而这期内容就涉及到了前面的第六期-RCE模块&#xff0c;第七期-File inclusion模块&#xff0c;第八期-Unsafe Filedownload模块。 什么是"遍历"呢&#xff1a;对学过一些开发语言的朋友来说应该知道&…...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 罗克韦尔PLC&#xff0c;但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控&#xff0c;引入了开疆智能Etherne…...

【Axure高保真原型】图片列表添加和删除图片

今天和大家分享图片列表添加和删除图片的原型模板&#xff0c;效果包括&#xff1a; 点击图片列表的加号可以显示图片选择器&#xff0c;选择里面的图片&#xff1b; 选择图片后点击添加按钮&#xff0c;可以将该图片添加到图片列表&#xff1b; 鼠标移入图片列表的图片&…...

如何让非 TCP/IP 协议驱动屏蔽 IPv4/IPv6 和 ARP 报文?

——从硬件过滤到协议栈隔离的完整指南 引言 在现代网络开发中,许多场景需要定制化网络协议(如工业控制、高性能计算),此时需确保驱动仅处理特定协议,避免被标准协议(如 IPv4/IPv6/ARP)干扰。本文基于 Linux 内核驱动的实现,探讨如何通过硬件过滤、驱动层拦截和协议栈…...