C++之继承

一,概念及用法

1)概念

首先我们来了解一下官方的概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

官方定义说了一堆话,可能我们还没了解它的大概意思,现在我来帮助大家理解一下。首先抓住关键词——复用,继承的功能就是复用(使用已经写好的代码)。为什么要有继承呢?想象一个场景,我们要写一个教职工系统,学校有那么多类人,有老师,教务处处长,校长,辅导员,保安……,如果我们把他们都当作一个类,有很多的重复代码,比如年龄,性别,身高等等,有多少种类我们就要写多少份,我们能不能把他们提取出来,只需要一份,通过某种手段将他传递,这种手段就是继承。我们首先把所有职位的共同点提取出来,他们都是人,我们把人单独写一个类,然后继承给其他人,达到复用的效果。

2)用法

在子类(继承其他类的类称为子类)的名称后面先写“:”。然后再写继承其他类的方式——私有,公有,保护,再加父类(被继承的类或者想要继承的类)。

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "peter"; // 姓名int _age = 18;  // 年龄
};
//继承格式
class Student : public Person
{
protected:int _stuid; // 学号
};

那就有人要问了,继承方式有啥用?我们先看一张常用的表。(继承只继承父类中的公有成员,保护成员,不继承私有成员)

私有继承是自私的,自己继承了之后就不允许它的子类继承父类,也不允许外界直接访问,将父类的成员访问权限全改为私有。保护继承允许自己的子类继承,但是不允许外界访问,将父类中的公有成员访问属性改为保护。公有继承,允许外界直接访问父类的公有成员,不改变父类任何成员的访问属性。

3)构造函数和析构函数问题

在子类中如果我们不显示的调用父类的构造函数,会调用父类的无参构造函数,如果父类没有无参构造函数而导致报错,有参数则可以在初始化列表中调用,不建议在子类的构造函数中调用,因为它可能导致重复调用父类的构造函数,或者在某些情况下,可能根本不应该在子类构造函数体内部调用父类的构造函数。析构函数一般不需要我们管,系统默认调用就行了。

4)特殊情况

在继承的时候如果出现了,子类中的成员和父类中的成员命名一样怎么办,如果不指定类名,一般是子类优先,那我们想要用父类中的东西怎么办呢?我们可以使用父类名+::的方法访问,例如:

Person::add();
studengt::add();

这样就可以访问父类的成员变量和函数。

二,虚继承及原理

现在有一个场景如图

在Assistant类中是不是有两个person类,很明显我们不需要两个person类,这样子无疑浪费了很多的空间,我们应该怎么解决呢?C++给出了一直解决方法,虚拟继承。

1)虚拟继承用法

在public前面加上virtual,以前面的例子为例

但是这个virtual加在哪里又是一个问题,我们应该加在哪里呢?首先我们要知道哪个类是重复的多余的,然后再找到这重复类的直接子类,注意是直接子类(重复类的亲儿子)的继承方式前面加virtual。

2)原理

虚拟继承是如何实现的呢?其实很简单,就是判断有多个类的时候,只在公共区创建一个就行了。现在又出现了一个问题,构造函数会不会重复调用(因为有最原始的父类有两个类能直接调用它的构造函数,即上例person),但代码只有一份,这如果不处理好会直接报错,特别是带参的,这个时候我们可以在最子类(即上例的Assistant)显示的调用person的构造函数,这样子系统识别到虚拟继承就不会走其他类中包含的重复的类的构造函数,问题就这样完美解决了。

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

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

相关文章

leetcode:131.分割回文串

树形结构&#xff1a; 切割到字符串的尾部&#xff0c;就是叶子节点。 回溯算法三部曲&#xff1a; 1.递归的参数和返回值&#xff1a; 参数字符串s和startIndex切割线 2.确定终止条件&#xff1a; 当分割线到字符串末尾时到叶子节点&#xff0c;一种方案出现 3.单层搜索…

使用R语言建立回归模型并分割训练集和测试集

通过简单的回归实例&#xff0c;可以说明数据分割为训练集和测试集的必要性。以下先建立示例数据: set.seed(123) #设置随机种子 x <- rnorm(100, 2, 1) # 生成100个正态分布的随机数&#xff0c;均值为2&#xff0c;标准差为1 y exp(x) rnorm(5, 0, 2) # 生成一个新的变…

【C语言】assert断言:保护程序的利器

在软件开发过程中&#xff0c;我们经常会遇到一些假设条件或者预期行为。例如&#xff0c;我们可能假设一个函数的输入参数必须在某个范围内&#xff0c;或者某个变量的值应该满足特定的条件。当这些假设或预期行为被打破时&#xff0c;程序可能会出现异常行为&#xff0c;甚至…

Java+SpringBoot:高校竞赛管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

梯度提升树系列9——GBDT在多任务学习中的应用

目录 写在开头1. 多任务学习的基础知识1.1 多任务学习的概念和优势1.1.1 概念1.1.2 优势1.2 GBDT在多任务学习中的角色1.2.1 GBDT的基本原理1.2.2 GBDT在多任务学习中的应用2. 实际应用案例和最佳实践2.1 如何设计多任务学习模型2.2 成功案例分享2.2.1 推荐系统2.2.2 金融风控2…

vue响应式解析

vue响应式是响应啥&#xff1f;是数据与函数之间的响应&#xff0c;是做不到数据和数据之间的响应的&#xff0c;比如 let count ref(0); let num ref(count.value * 2);count改变&#xff0c;并不会导致num一起改变&#xff0c;因为js做不到数据和数据之间响应&#xff0c;…

2024年Midjourney 付费订阅流程 | Midjourney 各版本介绍,使用虚拟信用卡支付买Midjourney流程指南

1.Midjourney介绍 Midjourney 是一款备受欢迎的人工智能生成图像工具&#xff0c;它可以通过输入文字描述&#xff0c;自动生成精美的图像。与许多其他图像生成工具不同&#xff0c;Midjourney 不需要安装任何软件&#xff0c;也不受个人电脑性能的限制&#xff0c;因为它运行…

73. 矩阵置零(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a; matrix [[1,1,1],[1,0,…

H5/CSS 笔试面试考题(41-50)

简述对于以下 HTML,下列选项中哪一个 CSS 选择器效果与其他的不同 ( )ABC A:span:first-child B:span:nth-child(0) C:span:nth-child(-n+1) D:span:nth-last-child(3) 面试通过率:46.0% 推荐指数: ★★★★ 试题难度: 初级 试题类型: 选择题 答案:b 解析:span:fi…

(五)elasticsearch 源码之查询流程分析

https://www.cnblogs.com/darcy-yuan/p/17039526.html 1.概述 上文我们讨论了es&#xff08;elasticsearch&#xff0c;下同&#xff09;索引流程&#xff0c;本文讨论es查询流程&#xff0c;以下是基本流程图 2.查询流程 为了方便调试代码&#xff0c;笔者在电脑上启动了了…

dx 理想windows安装docker 并且运行项目

安装docker地址&#xff1a; https://docs.docker.com/desktop/install/windows-install/ 安装后运行两个报错&#xff1a; 1.wsl 直接下载更新 该win库即可&#xff1a; https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi 2.报错 Hardware assiste…

S32 Design Studio PE工具配置GPIO

首先我们来讲最简单的GPIO配置 代码生成 按照下图步骤就能配置一个基本的GPIO口&#xff0c;在组件里面选择pin_mux&#xff0c;选中就能配置使能和方向&#xff0c;no pin routed就是没有配置的。GPIO口分ABCDE组&#xff0c;每组从0到最大的序号。 然后在functional prope…

Linux下的json-c

一、json-c库的安装(ubuntu) root用户运行以下命令&#xff1a; apt-get install libjson0-dev libjson0非root用户运行以下命令&#xff1a; sudo apt-get install libjson0-dev libjson0二、解析json数据 1. json_object json_object是JSON-C库中定义的一个结构体&#…

Java IO:概念和分类总结

前言 大家好&#xff0c;我是chowley&#xff0c;刚看完Java IO方面内容&#xff0c;特此总结一下。 Java IO Java IO&#xff08;输入输出&#xff09;是Java编程中用于处理输入和输出的API。它提供了一套丰富的类和方法&#xff0c;用于读取和写入数据到不同的设备、文件和…

【股票行业统计】 A股概念板块、A股行业分类

一、题记 1. A股有哪些行业分类、A股行业大全及细分 2. A股有哪些板块分类、A股概念板块龙头股 3. A股有多少个概念&#xff0c;A股有多少个板块 二、A股行业分类概述 1. 股票的行业分类&#xff0c;用的最多的是指数公司或者券商编制发布的&#xff0c;每家的标准不太一样。常…

设计模式-单例模式(懒汉+饿汉+线程安全模式)

目录 单例模式懒汉模式饿汉模式线程安全的懒汉模式双重检查锁定&#xff08;过时&#xff0c;错误的版本&#xff09;C11 特有的线程安全懒汉模式 单例模式 单例模式可以说是23种设计模式中最为简单的一种设计模式 类中只有唯一一个实例并且是私有化的&#xff0c;只能通过公…

多机多卡运行nccl-tests和channel获取

nccl-tests 环境1. 安装nccl2. 安装openmpi3. 单机测试4. 多机测试mpirun多机多进程多节点运行nccl-testschannel获取 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8nccl 2.15.1NVIDIA GeForce RTX 4090 *2 1. 安装nccl #查看cuda版本 nv…

npm config set registry https://registry.npm.taobao.org 这个设置了默认的镜像源之后如何恢复默认的镜像源

要恢复npm默认的镜像源&#xff0c;你可以使用以下命令将registry设置回npm的官方源&#xff1a; npm config set registry https://registry.npmjs.org/这个命令会修改你的全局npm配置&#xff0c;将包的下载源改回npm官方的源。这样做之后&#xff0c;任何后续的npm install…

逐鹿比特币生态,Elastos 携新作 BeL2「重出江湖」

撰文&#xff1a;Babywhale&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 刚刚过去的 2023 年&#xff0c;「比特币生态」成为了市场的绝对焦点之一。从铭文开始&#xff0c;到重新走进大众视野的 Stacks 与比特币闪电网络&am…