多态的相关知识

一.多态的概念

1.多态:多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。

2.多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。

1>编译时多态(静态多态)主要就是函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通过参数不同达到多种形态。

2>运⾏时多态(动态多态),具体点就是去完成某个⾏为(函数),传不同的对象就会完成不同的⾏为,就达到多种形态。

二.多态的定义及实现

1.实现多态的两个重要条件

1>必须是基类的指针或引用调用虚函数

注:只有基类的指针或引用才能指向派生类对象

2>被调用的必须是虚函数

注:派生类必须对基类的虚函数重写,才能有不同的函数,才能达到多态的多种效果

2.虚函数

1>定义:类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。

注:⾮成员函数不能加virtual修饰。

class Person
{
public:virtual void BuyTicket(){cout << "成人买票-全价" << endl;}
};

2>虚函数的重写/覆盖:派⽣类中有⼀个跟基类完全相同的虚函数(即派⽣类虚函数与基类虚函数的返回值、类型、函数名字、参数列表完全相同),称派⽣类的虚函数重写了基类的虚函数。

class Person
{
public:virtual void BuyTicket(){cout << "成人买票-全价" << endl;}
};class Student:public Person
{
public:virtual void BuyTicket(){cout << "学生买票-半价" << endl;}
};


注:

1.在重写基类虚函数时,派⽣类的虚函数在不加virtual关键字也可以构成重写,但是该种写法不规范

2.协变:派⽣类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引⽤,派⽣类虚函数返回派⽣类对象的指针或者引⽤时,称为协变。(一种特殊情况,只要能区分这种情况下也属于多态就行了)

3>两个关键字:override和final

(1)override:帮助⽤⼾检测是否重写。

(2)final:如果不想让派⽣类重写这个虚函数,那么可以⽤final去修饰。

4>纯虚函数和抽象类

(1)纯虚函数:在虚函数的后⾯写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现,只要声明即可

(2)抽象类:包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派⽣类继承后不重写纯虚函数,那么派⽣类也是抽象类。

3.析构函数的重写:基类的析构函数建议写成虚函数的形式

基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析构函数构成重写。这是因为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了vialtual修饰,派⽣类的析构函数就构成重写。

4.重载/重写/隐藏的联系与区别

三.多态实现的原理

1.虚函数表指针:一个含有虚函数的类中都⾄少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。

2.实现:满⾜多态条件后,底层运⾏时到指向的对象的虚表中确定对应的虚函数的地址,实现了指针或引⽤指向基类调⽤基类的虚函数,指向派⽣类就调⽤派⽣类对应的虚函数。

3.动态绑定与静态绑定

(1)静态绑定:对不满⾜多态条件的函数调⽤是在编译时绑定,即编译时确定调⽤函数的地址,叫做静态绑定。

(2)动态绑定:满⾜多态条件的函数调⽤是在运⾏时绑定,即在运⾏时到指向对象的虚函数表中找到调⽤函数的地址,也就做动态绑定。

4.虚函数表

(1)基类对象的虚函数表中存放基类所有虚函数的地址。

(2)派⽣类由两部分构成,继承下来的基类和⾃⼰的成员,⼀般情况下,继承下来的基类中有虚函数表指针,⾃⼰不会再⽣成虚函数表指针。但是要注意继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个

(3)派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。

(4)派⽣类的虚函数表中包含:基类的虚函数地址,派⽣类重写的虚函数地址,派⽣类⾃⼰的虚函数地址三个部分。

(5)虚函数表本质是⼀个存虚函数指针的指针数组

(6)虚函数和普通函数⼀样的,编译好后是⼀段指令,都是存在代码段的,只是虚函数的地址⼜存到了虚表中。

(7)虚表存放在哪里没有具体规定,不同编译器有自己的存放位置,经过测试发现存放地址与常量区地址重合度最高

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

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

相关文章

Datawhale------Tiny-universe学习笔记——Qwen

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说&#xff0c;猛一听这个名字首先会一懵&#xff1a;Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍&#xff1a;Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

庆祝中华人民共和国成立75周年答题活

为庆祝中华人民共和国成立75周年&#xff0c;弘扬爱国主义精神&#xff0c;激发广大党员干部和人民群众奋进新征程、建功新时代&#xff0c;奋力推进中国式现代化建设的爱国热情&#xff0c;“学习强国”学习平台采用“线上答题线下竞赛”的形式&#xff0c;举办“学习强国 强国…

STM32外设之LTDC/DMA2D—液晶显示(野火)

文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么&#xff0c;有几种屏&#xff0c;有什么组成。 怎么控制&#xff0c;不同屏幕控…

go多线程

1、简单使用&#xff08;这个执行完成&#xff0c;如果进程执行比较久&#xff0c;这里不会等待它们结束&#xff09; package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…

借老系统重构我准备写个OpenAPI3.1版的API管理工具(附录屏演示)

前段时间一直在忙公司老系统重构的方案设计&#xff0c;其中最大的重构点就是前后端分离。为了加快前后端协同开发和对接的工作效率&#xff0c;我决定写一个公司内部使用的OpenAPI3.1版的API管理工具。 文章目录 有现成的工具为啥不用现有成熟方案初步成果展示录屏演示下一步计…

基于springboot酒店管理系统

酒店管理系统 552酒店管理系统 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;…

医学数据分析实训 项目三 关联规则分析预备项目---购物车分析

文章目录 1 预备项目关联规则分析实践———购物车分析1 产生频繁集2 产生关联规则 1 预备项目 关联规则分析实践———购物车分析 import warnings import numpy as np import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns …

SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue

介绍 在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机&#xff0c;内存中的消息会丢失内存空间有限&#xff0c;当消费者故障或处理过慢时&#xff0c;会导致消息积压&#xff0c;引发MQ阻塞 在消息队列运行的过程中&#xf…

MFEA/D-DRA--基于分解和动态资源分配的多目标多任务优化

MFEA/D-DRA–基于分解和动态资源分配的多目标多任务优化 title&#xff1a; A Multiobjective multifactorial optimization algorithm based on decomposition and dynamic resource allocation strategy author&#xff1a; Shuangshuang Yao, Zhiming Dong, Xianpeng Wang…

Python编码系列—Python适配器模式:无缝集成的桥梁

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

C++进阶:二叉搜索树

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若…

tea 加密解密算法(面向ctf-reverse使用,光速学会tea逆向套路)

一&#xff0c;算法特征 tea算法的主要特征表现在sum和delta变量&#xff0c;以及3行核心加密中出现的右移4左移5&#xff0c;两行各有3个小括号互相异或 在题目中看到这些特征时就应该警醒这是tea相关算法 delta的值一般为0x9E3779B9(-0x61C88647)&#xff0c;但题目中往往…

深入了解字符函数和字符串函数

前言&#xff1a;今天给大家深入理解一下字符函数 和 字符串函数。通过使用 和 模拟实现 带大家加深理解&#xff0c;让大家灵活使用。 字符函数 在C语言中&#xff0c;有一系列函数是专门做字符分类的&#xff0c;也就是一个字符属于什么类型的字符。 这些函数的使用都要包含…

IDEA复制代码到MD笔记格式还手动调,赶紧试试这个功能,一步到位

你是否曾经有过这种复制代码到笔记代码块的经历&#xff0c;选中后代码左侧有一些空格 然后粘到Markdown笔记里除第一行外&#xff0c;其他几行都要手动向前缩进&#xff0c;真是逼死强迫症啊 但是&#xff0c;其实idea工具中有一个“列选择模式”的功能&#xff0c;我们可以…

初中生物--5.单细胞生物

单细胞生物 单细胞生物整个身体只由一个细胞构成&#xff0c;是生物 圈中非常原始&#xff0c;形态微小、结构简单的一类生物。大多数生活在水域或湿润的环境中&#xff0c;也有寄生在 其他生物身体上 例如&#xff1a;大肠杆菌、眼虫、酵母菌、变形虫、衣藻、草履虫 草履虫 …

微信视频号导出视频软件

最近研究了一下微信视频号导出视频的方法&#xff0c;目前发现还是比较难搞&#xff0c;查了一些资料&#xff0c;写了一个可以导出视频的软件&#xff0c;目前还不完善&#xff0c;但是导出视频到本地还是没问题&#xff0c;先用着吧&#xff0c;后期再完善。先记录一下。 测…

linux网络编程1

24.9.16学习目录 一.TCP/IP协议简介1.TCP/IP的分层结构2.协议的简介 二、MAC地址和IP地址1.网卡2.MAC地址3.IP地址&#xff08;1&#xff09;IP地址的分类&#xff08;2&#xff09;IP地址的特点&#xff08;3&#xff09;回环IP地址 3.子网掩码4.端口&#xff08;1&#xff09…

神经网络通俗理解学习笔记(5) 自然语言处理

自然语言处理 词嵌入和word2vec词义搜索和句意表示预训练模型Hugging Face库介绍经典NLP数据集代码案例-电影评论情感分析 词嵌入和word2vec 词嵌入是一种 将高维的数据表示映射到低维空间的方法 word embedding 是将语言中的词编码成向量便于后续的分析和处理 词嵌入和词向量…

JavaScript 事件处理

一、简介 ​ 事件&#xff1a;发生在HTML元素上的事情&#xff0c;可以是用户的行为&#xff0c;也可以是浏览器的行为&#xff0c;如 用户点击了某个HTML元素用户将鼠标移动到某个HTML元素上用户输入数据时光标离开页面加载完成 ​ 事件源&#xff1a;事件触发的源头&#xf…

Maya怎么把黑色的面反转为白色面

1、选中需要调整的面。 2、点击菜单栏中的“网格显示”&#xff0c;再点击点击“反转(Reverse)”。 3、反转后&#xff0c;原本黑色的面将会变成正常的面&#xff0c;法线方向也会相应改变。 按住ctrlshift鼠标中键 拖动快捷图标至工具栏