C++杂说- 多态和继承的知识在总结

多态

就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。

构成多态还有两个条件:

1. 必须通过基类的指针或者引用调用虚函数

2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

虚函数

即被virtual修饰的类成员函数称为虚函数。

虚函数的重写(覆盖)

派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的 返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数

虚函数重写的两个例外:

1. 协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

2. 析构函数的重写(基类与派生类析构函数的名字不同) 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字, 都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同, 看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处 理,编译后析构函数的名称统一处理成destructor。

C++11 override 和 final

1. final:修饰虚函数,表示该虚函数不能再被重写

2. override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错

抽象类

在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生 类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

接口继承和实现继承

普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成 多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。

继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。 组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。 比特就业课 优先使用对象组合,而不是类继承 。


1.什么是姜形继承?姜形继承的问题是什么?


菱形继承的定义:
萎形继承是面向对象编程中多继承的一种特殊情况,具体指的是两个子类继承同一个父类,而又有另一个子类同
时继承这两个子类。这种继承关系形成了一个菱形的结构,因此被称为菱形继承。
菱形继承的问题:
菱形继承主要存在两个问题:
1.数据冗余:由于子类同时从两个不同的父类继承同一个基类,这可能导致在子类中存在多份基类成员变量的
副本。例如,如果A类有两个子类B和C,B和C都继承了A类的某个成员变量,而D类同时继承了B和C,那么
类中就会包含该成员变量的两份副本,造成数据几余。
2.数据二义性:在菱形继承中,由于子类继承了两个父类,而这两个父类又都继承了同一个基类,当子类尝试
访问基类中的某个成员时,编译器可能无法确定应该访问哪个父类中的那份成员,从而导致编译错误或运行
时错误。


2.什么是菱形虚拟继承?如何解决数据冗余和二义性的?


菱形虚拟继承的定义:
萎形虚拟继承是在萎形继承的基础上,通过在继承方式前加上 virtua! 关键字来解决的。虚拟继承的目的是确保在
菱形继承结构中,基类成员在最终派生类中只存在一份副本,从而解决数据冗余和数据二义性的问题。
解决数据冗余和二义性的方法:
1.使用虚拟继承:通过在菱形继承的分又点(即同时继承多个父类的子类)使用 virtual 关键字来继承共同的基类,可以确保基类成员在最终派生类中只有一份副本。这样,无论最终派生类通过哪条路径继承基类,都只
会访问到这份唯一的副本。
2.虚基表:虚拟继承的实现通常依赖于虚基表。虚基表是一个特殊的表,用于存储基类成员的偏移量信息。当
最终派生类需要访问基类成员时,它可以通过虚基表找到基类成员在内存中的实际位置,从而避免数据冗余
和数据二义性。


3.继承和组合的区别?什么时候用继承?什么时候用组合?


继承和组合的区别:
1.本质:继承体现的是一种”is-a”的关系,即子类是父类的一种;而组合体现的是一种"has-a”的关系,即一个类包含另一个类的对象。
2.耦合度:继承是一种紧耦合的关系,子类与父类之间紧密相连;而组合是一种松耦合的关系,组合类与被包含类之间相对独立。
3.复用方式:继承是接口的复用,子类可以继承父类的接口并实现自己的逻辑;组合是实现的复用,组合类可以使用被包含类提供的接口,但不需要继承其实现。
使用时机:

使用继承的时机:
·当子类确实是父类的一种特殊形式时,可以使用继承。例如,学生和教师都是人的特殊形式,因此可以使用继承来表示这种关系。
当子类需要重用父类的接口并实现自己的逻辑时,也可以使用继承。例如,子类可以继承父类的某些方法,并在自己的实现中进行扩展或修改。
使用组合的时机:
当类之间存在"has-a"的关系时,应该使用组合。例如,一个汽车类包含一个发动机类的对象,此时应该使用组合来表示这种关系。
当需要保持类的独立性和封装性时,应该优先考虑使用组合。因为组合关系相对独立,不会破坏类的封装性,也不会导致子类与父类之间的紧密耦合。
综上所述,继承和组合各有其适用场景。在实际编程中,应根据具体的需求和类的关系来选择合适的复用方式。

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

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

相关文章

67.SAP FICO-凭证类型学习

目录 SAP凭证类型 凭证类型的作用 - OBA7 SAP默认的凭证类型更改 FI相应事务代码默认凭证类型 - OBU1 对FB50、60、70默认凭证类型的更改 - OBZO 后勤货物移动默认凭证类型 - OMBA 发货凭证类型 收货凭证类型 自动移动凭证类型 存货盘点凭证类型 发票默认的凭证类…

vue3中使用provide跨层传值(方法)

1.使用provide inject 跨层实现 祖父组件: provide有两个参数,第一个是我们传递的key,第二个就是value了 孙子组件: const dataList inject(getDataList1)//使用inject接收 const dataList1 dataList.getDataList 页面中使…

制作问卷表单二维码的方法,扫码登记信息更快捷

为了更好地收集用户信息,现在很多场景下会使用生成二维码的方式,让用户可以扫码自行填写相关信息,从而提高获取信息的效率以及填写数据的便捷性。那么用于收集用户数据的表单二维码是如何生成的呢?其实方法很简单,现在…

2.pwn的linux基础(计算机内部数据结构存储形式)

linux基础 保护层级: 分为四个ring0-ring3 一般来说就两个,0和3 0为内核 3为用户 权限: 用户分为多个组 文件和目录等等的权限一般都是三个,即可读可写可执行。 读:R,写:W,执行:X 赋予一个可执行文件执行权限就是chmod x file…

KBPC5010-ASEMI逆变焊机专用KBPC5010

编辑:ll KBPC5010-ASEMI逆变焊机专用KBPC5010 型号:KBPC5010 品牌:ASEMI 封装:KBPC-4 正向电流(Id):50A 反向耐压(VRRM):1000V 正向浪涌电流&#xff…

Vue89-Vuex中多组件共享数据

一、需求 1-1、count组件读取persons数据 借助mapState映射。 1-2、personList组件读取sum数据

MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning

文章汇总 LoRA的问题 与FFT相比,低秩更新难以记忆新知识。虽然不断提高LoRA的秩可以缓解这一问题,但差距仍然存在。 动机 尽可能地利用相同的可训练参数来获得更高的 Δ W \Delta W ΔW秩。 考虑到预训练权值 W 0 ∈ R d k W_0\in R^{d\times k} W0​…

【HTML入门】第五课 - 加粗和倾斜的字体们

这一小节,我们说一些常用的HTML文本格式化的标签知识。可能你会觉得HTML知识比较零散,有好多标签。没错,就是比较零散,标签比较多。正式这些形形色色的HTML标签们,组成了丰富多彩的网页元素。 但是在刚学习的时候&…

Linux-gdb

目录 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 4.快速跳出函数体 5.其他 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 断点的本质是帮助我们缩小出问题的范围 比如,…

three-platformize 微信小程序 uniapp 使用截图功能

最近需要将3d场景进行截图,但是网上的各种各样,看的我一团乱麻,因此在解决完后就将这些简单的分享一下; 原理:将3维场景的那个canvas中的像素提取出来,找一个空的canvas二维画布放上去,然后用二…

剪映PC电脑版开心版5.5.0免VIP导出补丁下载_替换一次即可长期使用

剪映5.5.0免VIP导出补丁来了,可以使用VIP特效,文字转语音声效,滤镜,等全部需要VIP的素材,都可以直接导出,不需要VIP 并且是需要替换一次,每次启动软件都是可以直接导出的,只要不重新…

vue学习day02-Vue指令-v-html、v-show与v-if、v-else与v-else-if、v-on、v-bind、v-for、v-model

6、Vue指令 指令:带有v-前缀的特殊标签属性 (1)v-html 作用:设置元素的innerHTML 语法:v-html“表达式” 示例: 提供一个地址,这里是百度的地址,通过v-html渲染 结果&#xff…

【C语言】auto 关键字详解

在C语言中,auto关键字用于声明局部变量,但它的使用已经变得很少见。事实上,从C99标准开始,auto关键字的默认行为就是隐含的,因此在大多数情况下无需显式使用它。 基本用法 在C语言中,auto关键字用于指定变…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议(ICBAIE 2024)定于2024年10月25-27号在中国深圳隆重举行。…

大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践

直接偏好优化(Direct Preference Optimization,DPO)算法是大语言模型对齐的经典算法之一,它巧妙地将奖励模型(Reward Model)训练和强化学习(RL)两个步骤合并成了一个,使得训练更加快…

绝区柒--LLM简史

这是一系列LLM介绍的可成,分以下五个不分 序言:大型语言模型LLM简史第一部分:代币化——完整指南第 2 部分:使用 Python 中的 Scratch 从零开始使用 word2vec 进行词嵌入第 3 部分:用代码解释自注意力机制第 4 部分&a…

uniapp easycom组件冲突

提示信息 ​easycom组件冲突:[/components/uni-icons/uni-icons.vue,/uni_modules/uni-icons/components/uni-icons/uni-icons.vue]​ 问题描述 老项目,在uniapp插件商城导入了一个新的uniapp官方开发的组件》uni-data-picker 数据驱动的picker选择器 …

关于嵌入式系统中的LED控制程序的一篇爽文

嵌入式系统中的LED控制程序 在嵌入式系统中控制LED是一个很常见的任务,可以用于指示状态、显示信息等。我们将使用C语言编写一个简单的LED控制程序,该程序将控制一个虚拟的LED,但可以根据需要将其扩展到实际的硬件上。 准备工作 在开始之前…

centos7升级到欧拉openeule

centos7升级到欧拉openeule 一、准备工作 1、安装迁移工具(安装迁移工具的机器不能给自己升级,请用其他机器作为迁移母机) wget https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/x2openEuler/x86_64/Packages/x2…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…