C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构

在这里插入图片描述

2. 继承的切片

在这里插入图片描述

3. 重定义/隐藏

重定义/隐藏:派生类和基类有同名的成员,就叫隐藏。派生类的成员隐藏了基类的成员。

隐藏时可以通过类作用限定符来访问被隐藏的成员。

class Person
{
public:void Print(){cout << "Person " << ID << endl;}string name;	// 姓名int ID = 0;			// 身份证号
};// 派生类Student继承了基类Person
class Student : public Person
{
public:void Print(){cout << "Student " << ID << endl;}int ID = 1;	// 学号
};// 派生类Teacher继承了基类Student
class Teacher : public Student
{
public:void Print(){cout << "Teacher " << ID << endl;}int ID = 2;	// 工号
};
// 重定义/隐藏
void Test3()
{// 在上面的三个类中,成员函数Print()和成员变量ID都属于隐藏/重定义Person per;Student stu;Teacher tea;tea.Print();tea.Student::Print();tea.Person::Print();
}
// 输出结果为:
// Teacher 2
// Student 1
// Person 0

4. 派生类的默认成员函数

在说继承的切片时提到,我们可以将派生类中从基类那里拷贝过来的一部分成员变量看作一个整体,视为一个新的成员变量,它的类型是基类。
因此,在讨论派生类的默认成员函数的时候,我们就能明白一些规则。

为了方便叙述,我们对派生类进行以下划分:
在这里插入图片描述

  1. 构造函数

    在类中,若存在一个成员变量也是一个类,那么构造函数就会自动调用这个成员变量的默认构造函数,这里也是这个道理。

    派生类的构造函数会调用基类的默认构造函数,以完成对属于基类的那一部分的成员(上图的A部分)的初始化。如果基类没有默认构造函数,那么在派生类的构造函数中,就要显式调用基类的构造函数。

    先调用基类的构造,完成对A部分的构造,再构造B部分自己。

  2. 拷贝构造

    B部分的拷贝需要派生类自己来实现,但是A部分,则需要调用基类的拷贝构造函数来完成拷贝。

  3. 赋值运算符重载 operator=

    同理,A部分也需要调用基类的赋值运算符重载来完成这部分的赋值初始化。

  4. 析构函数

    先完成对B部分的析构,然后不用显式调用,编译器会自动调用基类的析构函数,来完成A部分的析构。

5. 继承与友元

友元关系并不能继承。
基类的友元,并不是派生类的友元,就好比父亲的朋友并不一定是孩子的朋友。
如果想要既是基类的友元,又是派生类的友元,则需要在两个类中都声明友元。

6. 继承与静态成员

基类中的静态成员,会和成员函数一样,仅仅生成一份,所有派生类用到的静态成员,都是这一份。这样做避免空间浪费。

7. 菱形继承和菱形虚拟继承

C++中允许多继承,也就是一个类继承了两个父类,这必然导致一个问题:菱形继承,请参考下图:
在这里插入图片描述

可见,在D类对象中,存了两份int a,这导致二义性和数据冗余的问题,在访问d对象中的a成员时,访问的是从B类中继承来的a呢,还是从C类中继承来的a?当然,解决方案就是:继承时,在作用域限定符::后加上关键字virtual
这便是虚拟继承,可以让int a 进存一份,B类对象、C类对象以及D类对象,仅需通过偏移量就可以得到a的地址。

用域限定符::后加上关键字virtual
这便是虚拟继承,可以让int a 进存一份,B类对象、C类对象以及D类对象,仅需通过偏移量就可以得到a的地址。

8. 组合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码学习记录19

随想录日记part19 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.14 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及修剪二叉搜索树 &#xff1b;将有序数组转换为二叉搜索树&#xff1b;把二叉搜索树转换为累加树。 669. 修剪…

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

如何实现系统的高可用性

实现系统的高可用性是确保系统持续提供服务的关键要素。下面是一些常见的高可用方案&#xff1a; 冗余部署&#xff1a;将系统的关键组件部署在多台服务器上&#xff0c;通过搭建主备或者集群的架构来实现冗余。当主服务器出现故障时&#xff0c;备用服务器能够自动接管&#…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

面试 Java 并发编程八股文十问十答第六期

面试 Java 并发编程八股文十问十答第六期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;synchronized 和 R…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

23.查询所有列

选择所有列 SELECT * FROM 表名; 用跟在SELECT关键字后面的星号(*),你能够显示表中数据的所有列。 实例&#xff1a; 查询departments表中的所有数据 select * from departments; 选择指定列 select 列名1,列名2... from 表名; 能够用SELECT语句显示表的指定列&#xf…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

目录 基本原理 加密哈希&#xff1a; 公钥加密&#xff1a; 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所…

SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的&#xff0c;这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。 官方链接&#xff1a;日日新开放平台 一、Function Call 是个啥&#xff1f; 在 LLM&#xff08;Large Language Model&#xff09; 语言大模型时代&…

[论文笔记]DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning

引言 今天带来21年一篇关于用强化学习玩斗地主的论文:DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning。 斗地主是一个具有竞争、合作、信息不完全、状态空间庞大以及大量可能动作的极具挑战性的领域,尤其是合法动作在每一轮中变化显著。在这项工…

SpringBoot 过滤器和拦截器的区别

SpringBoot 过滤器和拦截器的区别 SpringBoot 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都可以在请求处理的不同阶段执行特定的操作&#xff0c;但它们之间存在一些关键的区别&#xff1a; 1. 执行层级 过滤器&#xff08;Filt…

YOLOv9实例分割教程|(二)验证教程

专栏地址&#xff1a;目前售价售价59.9&#xff0c;改进点30个 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、验证 打开分割验证文件&#xff0c;填入数据集配置文件、训练好的权重文件&…

报告合集 |2023年,5份必读的“数字孪生”行业报告合集(文末下载)

数字孪生正在快速改变多个行业的面貌。它通过创建物理世界对象的虚拟复制&#xff0c;使得数据分析和系统优化能够在数字空间中实现&#xff0c;正在制造业、城市规划、医疗保健等国家支柱行业展现出巨大的变革力量&#xff0c;为行业的智能决策和预测提供了强大的支撑。 作为…

【UE】AI行为树入门——以小白人跟踪玩家并攻击为例

目录 前言 效果 步骤 一、准备工作 二、用蓝图实现AI随机移动 三、用行为树实现AI随机移动与跟踪玩家并攻击的效果 3.1 AI随机移动 3.2 AI看到玩家后跟踪玩家 3.3 AI攻击玩家 前言 本篇文章要实现的效果是&#xff1a;小白人随机移动&#xff0c;并且在移动过程中如…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…

算法之动态规划

什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的 动态规划解题步骤 确定dp数组&#xff…

Material UI 5 学习03-Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…