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的构造函数,这样子系统识别到虚拟继承就不会走其他类中包含的重复的类的构造函数,问题就这样完美解决了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点&#xff1a; 线程的缺点&#xff1a; 线程的用途&#xff1a; 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

原来你也可以DDOS?

首先祝大家新年快乐 这次内容就主要是纸上谈兵&#xff08;因为无法未经试验无法保证成功&#xff09;&#xff0c;而且有关这方面的科普视频也已经有很多了。 原文地址&#xff1a;原来你也可以DDOS&#xff1f; - Pleasure的博客 下面是正文内容&#xff1a; 前言 DDOS是一…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1.1 Hive底层架构 1 &#xff09;用户接口&#xff1a; Client CLI &#xff08; command-line interface &#xff09;、 JDBC/ODBC(jdbc 访问 hive) 、 WEBUI &#xff08;浏览器访问 hive &#xff09; 2 &#xff09;元数据&#xff1a; Metas…

mxxWechatBot流程与原理

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…

高级自定义标记功能

高级自定义标记功能 自定义标记时用户定义的标记,它可通过创建可重用的组件来尽量较少JSP中复杂、重复的业务逻辑代码。这些组件可用于其他应用程序。Javax.servlet.jsp.tagtext包定义了开发自定义标记的类和接口。您可以使用此包的类和接口创建标记处理程序,这些程序可实现带…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

面了滴滴的数据分析师(实习),几道面试题都是原题啊。。。

年前&#xff0c;技术群组织了一场数据类的技术&面试讨论会&#xff0c;邀请了一些同学分享他们的面试经历&#xff0c;讨论会会定期召开&#xff0c;如果你想加入我们的讨论群或者希望要更详细的资料&#xff0c;文末加入。 喜欢本文记得收藏、关注、点赞 。技术交流文末…

Unity类银河恶魔城学习记录7-2 P68 Setting up details of sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill.cs using System.Collections; using System.Collections.Gen…

【数据结构】14 队列(带头结点的链式存储和顺序存储实现)

定义 队列是一个有序线性表&#xff0c;但是队列的插入、删除操作是分别在线性表的两个不同端点进行的。 设一个队列 Q ( a 1 , a 2 , . . . , a n ) Q (a_1, a_2,...,a_n) Q(a1​,a2​,...,an​)&#xff0c;那么 a 1 a_1 a1​被称为队头元素&#xff0c; a n a_n an​为队…

【实战】一、Jest 前端自动化测试框架基础入门 —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

Javaweb之SpringBootWeb案例之事务进阶的详细解析

1.3 事务进阶 前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性&#xff1a; 异常回滚的属性&#xff1a;rollbackFor 事…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【C++】STL之string 超详解

目录 1.string概述 2.string使用 1.构造初始化 2.成员函数 1.迭代器 2.容量操作 1.size和length 返回字符串长度 2.resize 调整字符串大小 3.capacity 获得字符串容量 4.reserve 调整容量 5.clear 清除 6.empty 判空 3.string插入、追加 、拼接 1.运算…

【MySQL】MySQL函数学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Ny0xnYjfHqF7s3aS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【DDD】学习笔记-精炼领域分析模型

通过统一语言与“名词动词法”可以迫使团队研究问题域的词汇表&#xff0c;简单而快速地帮助我们获得初步的分析模型。但是这种方法获得的模型品质&#xff0c;受限于语言描述的写作技巧&#xff0c;统一语言的描述更多体现在是对现实世界的模型描述&#xff0c;缺乏深入精准的…

招商证券流年不利:屡因保荐失职“连坐”,各业务分部收入下滑

近日&#xff0c;安徽证监局发布公告称&#xff0c;招商证券股份有限公司&#xff08;下称“招商证券”&#xff09;“15城六局”债券的受托管理方面存在未督导发行人做好募集资金管理、未持续跟踪和监督发行人履行有关信披临时报告义务等情形。 根据《公司债券发行与交易管理…

Java中的IO介绍

本章内容 一 、File概念 File可以代表一个目录或者一个文件&#xff0c;并不能代表文件的内容 文件和流的区别&#xff1a;File关注的是文件本身的特征&#xff0c;如名称、路径、修改时间、大小。 流关注的是文件的内容。 二、File基本的操作 常见构造方法 | File(String p…

nginx2

mkdir /usr/local/develop cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz yum install git git clone https://github.com/arut/nginx-rtmp-module.git 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd nginx-1.17.4/ 安装编译…

EMC学习笔记(二十六)降低EMI的PCB设计指南(六)

降低EMI的PCB设计指南&#xff08;六&#xff09; 1.PCB布局1.1 带键盘和显示器的前置面板PCB在汽车和消费类应用中的应用1.2 敏感元器件的布局1.3 自动布线器 2.屏蔽2.1 工作原理2.2 屏蔽接地2.3 电缆屏蔽至旁路2.4 缝隙天线&#xff1a;冷却槽和缝隙 tips&#xff1a;资料主要…