【C++进阶】:继承

news2024/11/25 22:42:51

继承

  • 一.继承的概念和定义
    • 1.概念
    • 2.定义
  • 二.基类和派生类对象赋值转换
  • 三.继承中的作用域
  • 四.派生类的默认成员函数
  • 五.继承与友元
  • 六.继承与静态成员
  • 七.复杂的菱形继承及菱形虚拟继承
    • 1.二义性
    • 2.原理
  • 八.总结

一.继承的概念和定义

1.概念

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

在这里插入图片描述

在这里插入图片描述

2.定义

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结:

1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected>private。
4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强

二.基类和派生类对象赋值转换

在这里插入图片描述

在这里插入图片描述

需要注意的是切割不会产生临时变量(例如int转化double会产生临时变量)。

三.继承中的作用域

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一道题

在这里插入图片描述

这两个函数实际上是隐藏(重定义)关系,这里很多人会认为是函数重载,实际上函数重载必须再同一作用域里,而这里处在不同作用域里。同时可以看到这里报错了,因为编译器根据就近规则,发现我们的fun函数少了参数,所以报错了。父子类里只要函数名相同就构成隐藏。

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

构造函数

c++规定,子类必须调用父类的构造函数去初始化父类的成员。如果父类有默认构造,编译器就会自动调默认构造。如果没有则必须在子类的初始化列表里初始化。

在这里插入图片描述

在这里插入图片描述

拷贝构造

在这里插入图片描述

赋值运算符重载

注意在进行父类成员赋值时别忘了加上父类名,避免重定义从而导致死循环。

在这里插入图片描述

析构函数

析构函数比较特殊,它会自动调用。因为编译器要保证析构顺序。

在这里插入图片描述

五.继承与友元

友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。就像我爸爸的朋友不是我的朋友一样。

在这里插入图片描述

六.继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子
类,都只有一个static成员实例。不会像其他成员继承时被拷贝。

在这里插入图片描述

在这里插入图片描述

七.复杂的菱形继承及菱形虚拟继承

1.二义性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那么一个assistant里就会出现两个名字,是不符合我们日常生活中的要求的,这样就造成了数据冗余和二义性。

在这里插入图片描述

虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和
Teacher的继承Person时使用虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地
方去使用。

在这里插入图片描述

2.原理

为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成员的模型。

下面B,C继承了A,D又继承了B,C

在这里插入图片描述

最终我们打印的是D类的成员,那么在内存里D类的成员是如何排序的呢?

在这里插入图片描述

其实是D里拷贝了一份C和B,而C和B里又各自拷贝了一份A,所以D里包含两份A。

在这里插入图片描述

在这里插入图片描述

而在使用了virtual关键字后,A类被单独拿了出来,这样D就只包含了一个A了。又可以看到B和C类里没有包含A了,但却多出来了一行数据,这些数据是什么呢?这两行实际上是都是指针,那么我们来看看指针指向的内容。

在这里插入图片描述

可以看到它指向的第一行是0是为其他成员指向预留。而第二行分别是20和12,这其实是B和C分别与A的相对距离。B的地址是0x00F9FA98, A是0x00F9FAAC,两个相减就是20,同理12就是C的地址减A的地址。那么偏移量有什么意义呢?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

八.总结

在这里插入图片描述

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

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

相关文章

虚拟文件描述符VFD

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 了解VFD 详细信息 1.相关数据类型 typedef struct vfd{int fd; /* current FD, or VFD_CLOSED if non…

23 自定义控件

案例:组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面: 选择Widget: 选择类名(生成.h、.cpp、.ui文件) 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间: 在主窗口w…

第17章 常见函数

创建函数 第一种格式采用关键字function,后跟分配给该代码块的函数名。 function name {commands }第二种 name() { commands }你也必须注意函数名。记住,函数名必须是唯一的,否则也会有问题。如果你重定义了函数,新定义会覆…

【时间复杂度】

旋转数组 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 /* 解题思路:使用三次逆转法,让数组旋转k次 1. 先整体逆转 // 1,2,3,4,5,6,7 // 7 6 5 4 3 2 1 2. 逆转子数组[0, k - 1] // 5 6 7 4 3…

C语言基本结构:顺序、选择和循环

文章目录 前言顺序结构代码讲解 选择结构代码讲解 循环结构总结 前言 在计算机编程中,掌握基本的编程结构是非常重要的。C语言作为一种广泛应用的编程语言,具有丰富的基本结构,包括顺序结构、选择结构和循环结构。这些基本结构为开发人员提供…

RocketMQ主从集群broker无法启动,日志报错

使用vmWare安装的centOS7.9虚拟机,RocketMQ5.1.3 在rocketMQ的bin目录里使用相对路径的方式启动broker,jps查询显示没有启动,日志报错如下 排查配置文件没有问题,nameServer也已经正常启动 更换绝对路径,启动broker&…

flutter:animate_do(flutter中的Animate.css)

简介 做过web开发的应该大部分人都知道Animate.css,它为开发者提供了一系列预定义的动画效果,可以通过简单的CSS类来实现各种动画效果。而animate_do 相当于flutter中的Animate.css,它提供了很多定义好的动画效果 基本使用 官方地址 https://pub-web.…

一文学会redis在springBoot中的使用

“收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧! 一、什么是redis缓存…

【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程

【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程 文章目录 【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程Anaconda31.安装Anaconda32.卸载Anaconda33.修改Anaconda3安装虚拟环境的默认位置 安装PyTorch3d确定版本对应关系源码编译安装Pytorch3d 总…

Day 65: 集成学习之 AdaBoosting (3. 集成器)

代码: package dl;import java.io.FileReader; import weka.core.Instance; import weka.core.Instances;/*** The booster which ensembles base classifiers.*/ public class Booster {/*** Classifiers.*/SimpleClassifier[] classifiers;/*** Number of classi…

解决报错:Can‘t connect to HTTPS URL because the SSL module is not available.

本人今天准备打开安装一个label-studio包,试了很多次,接连报如下错误,因此我就去找了一些解决方案,现在总结如下: 1、报错信息如下 2、解决方案如下: github上有对应的解决方案,链接&#xff…

教师ChatGPT的23种用法

火爆全网的ChatGPT,作为教师应该如何正确使用?本文梳理了教师ChatGPT的23种用法,一起来看看吧! 1、回答问题 ChatGPT可用于实时回答问题,使其成为需要快速获取信息的学生的有用工具。 从这个意义上说,Cha…

安卓开发后台应用周期循环获取位置信息上报服务器

问题背景 最近有需求,在APP启动后,退到后台,还要能实现周期获取位置信息上报服务器,研究了一下实现方案。 问题分析 一、APP退到后台后网络请求实现 APP退到后台后,实现周期循环发送网络请求。目前尝试了两种方案是…

Sui Builder House巴黎站精彩集锦

Sui Builder House巴黎站于7月19日圆满结束,Mysten Labs联合创始人兼CTO的Sam Blackshear在活动上发表了主题演讲。两天的Builder House活动还邀请了Mysten Labs的其他杰出成员分享Sui的发展情况和近期进展,社区成员展示了自己项目并提供见解&#xff0c…

C++继承体系中,基类析构函数请加上virtual,设置为虚函数

为什么建议在存在继承体系时刻我们的类的析构函数加上virtual呢? 大家看段代码。 咋一看,没什么毛病这段代码,让我们画图理解下。 紫框中的前4个字节指向new开辟的空间。 我们知道,当基类A指针指向基类B时候会发生切片 当我们del…

小程序如何修改商品

​商家可能会遇到需要修改产品信息的情况。无论是价格调整、库存更新还是商品描述的修改,小程序提供了简便的方式来帮助你们完成这些操作。下面是一些简单的步骤和注意事项,帮助你们顺利地修改商品。 一、进入商品管理页面 在个人中心点击管理入口&…

工厂电力监控解决方案

1、概述 电力监控系统实现对变压器、柴油发电机、断路器以及其它重要设备进行监视、测量、记录、报警等功能,并与保护设备和远方控制中心及其他设备通信,实时掌握供电系统运行状况和可能存在的隐患,快速排除故障,提高工厂供电可靠…

2023年Q2京东环境电器市场数据分析(京东数据产品)

今年Q2,环境电器市场中不少类目表现亮眼,尤其是以净水器、空气净化器、除湿机等为代表的环境健康电器。此外,像冷风扇这类具有强季节性特征的电器也呈现出比较好的增长态势。 接下来,结合具体数据我们一起来分析Q2环境电器市场中…

承接箱体透明拼接屏项目时,需要注意哪些事项?

承接箱体透明拼接屏项目时,需要注意以下事项: 确定需求:在承接箱体透明拼接屏项目之前,需要明确客户的需求,包括屏幕的大小、分辨率、亮度、色彩等参数,以及使用的环境、观看距离和观看角度等。 材料选择&…

图文教程:如何在 3DS Max 中创建3D迷你卡通房屋

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在本教程中,我们将学习如何创建一个有趣的、低多边形的迷你动画房子,你可以在自己的插图或视频游戏项目中使用它。您将学习的一些技能将包括创建基本的3D形状和基本的建模技术。让我…