多态的相关知识

news2024/11/22 17:20:24

一.多态的概念

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.coloradmin.cn/o/2140161.html

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

相关文章

Powerpaint介绍及实现局部重绘效果测试[comfyui]

&#x1f358;背景 powerpaint&#xff0c;是一个高质量多功能的图像修补模型&#xff0c;可以同时支持插入物体、移除物体、图像扩展、形状可控的物体生成。 这个模型也是国产的&#xff0c;原作者是清华大学深圳国际研究生院&#xff0c;清华大学 &#xff0c;上海人工智能…

JAVA:非对称加密技术的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 非对称加密是一种加密技术&#xff0c;使用一对密钥进行数据加密和解密。这两个密钥分别是公开密钥&#xff08;public key&#xff09;和私有密钥&#xff08;private key&#xf…

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2&#xff09;比较含退格的字符串 .1- 题目解析 .2- 代码编写 3&#xff09;基本计算器 II .1- 题目解析 .2- 代码编写 4&…

进程状态、进程创建和进程分类

文章目录 进程进程常见的状态进程调度进程状态变化关系 进程标识示例--进程标识的使用以及简介 进程创建fork函数vfork函数示例--使用fork函数创建子进程&#xff0c;并了解进程之间的关系 创建进程时发生的变化虚拟内存空间的变化示例--验证fork函数创建进程时的操作 对文件IO…

【例题】lanqiao3226 宝藏排序Ⅱ

样例输入 5 1 5 9 3 7样例输出 1 3 5 7 9解题思路 这里的n≤10^5&#xff0c;说明O(n ^2)的算法行不通。 基于比较的高效算法和基于数值划分的高效算法全部参考这篇文章 代码 最简单的自带排序 nint(input()) alist(map(int,input().split()))a.sort() print( .join(map…

量化交易backtrader实践(二)_基础加强篇(1)_数据列表准备与主要实践内容

上一篇回顾 上一篇是数据获取篇&#xff0c;在上一篇里&#xff0c;我们初步接触了backtrader的回测逻辑&#xff0c;重点放在了回测的数据获取的问题上&#xff0c;确保了我们在用合适且有效的正规数据在做回测&#xff0c;我们的目的是要通过backtrader深入讨论量化交易的内…

【Linux进程控制】进程等待

目录 进程等待 进程等待是什么&#xff1f; 为什么&#xff1f; 怎么办&#xff1f; wait方法 获取子进程status 多进程的等待问题 waitpid方法 什么是阻塞等待&#xff1f;什么是非阻塞等待&#xff1f; wait/waitpid获取子进程信息原理 进程等待 进程等待是什么&am…

【AI学习】陶哲轩在 2024 年第 65 届国际数学奥林匹克(IMO)的演讲:AI 与数学

陶哲轩在 2024 年第 65 届国际数学奥林匹克关于AI 和数学的演讲&#xff0c;很有意思。陶哲轩的讲话语速太快了&#xff0c;足见其聪明&#xff01; AI用于数学的一些方面&#xff1a; 陶哲轩介绍到刚刚被数学家接受并开始普及的方法&#xff1a;形式化证明辅助工具。 形式化…

API:连接数字世界的隐形纽带

在这个智能手机和应用程序无处不在的时代&#xff0c;你可能听说过API这个术语&#xff0c;但你知道它究竟是什么吗&#xff1f;API&#xff0c;全称为应用程序编程接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一种让不同的软件和服务之间能够…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; A. 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护。…

C++11第五弹:线程库 | 互斥锁 | 原子操作

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

蓝牙耳机是入耳式的好还是开放式的好?2024开放式耳机推荐

个人推荐入开放式耳机&#xff0c;戴起来更舒服&#xff0c;主要有以下几方面原因&#xff1a; 减少对耳部的压迫&#xff1a; 不入耳设计&#xff1a;开放式耳机通常不需要插入耳道&#xff0c;避免了对耳道的直接压迫。入耳式耳机的耳塞长时间塞在耳道内&#xff0c;会对耳…

Linux基础---07文件传输

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…

前端基础知识(HTML+CSS+JavaScript)

文章目录 一、HTML1.1 HTML 基础&#xff1a;1.1.1 HTML 的概念&#xff1a;1.1.2 认识 HTML 标签&#xff1a;1.1.3 HTML 文件基本结构&#xff1a;1.1.4 标签层次结构&#xff1a; 1.2 HTML 快速入门&#xff1a;1.3 HTML常见标签&#xff1a;1.3.1 标题标签&#xff1a;h1-h…

数据结构-2.顺序表

1.线性表 线性是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表有: 顺序表 , 链表 , 栈 , 队列... 线性表在逻辑上是线性结构, 也就是连续的一条直线 . 但是在物理结构上并不是连续的, 线性表在物理上存储时, 通常以数组和链式结…

5-----RYZ维修工具 操作界面预览与功能操作解析 刷机 解锁 修复参数等等

以上是工具选项功能的界面预览 。通过预览可以看到很多功能选项。此类工具涵盖了很多操作区域。需要根据自己机型的实际需求来操作。根据开发者的描述。此工具有一下功能。包含mtk刷机 分区修复。9008刷机 备份基带efs等等。 高通操作区域 高通修复串码 高通修改写入基带qc…

石化盈科PMO总经理任志婷受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 石化盈科信息技术有限责任公司运营管理部总经理兼PMO总经理任志婷女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“激活关键的少数派——项目经理培养体系的设计实践”。大会…

无人机视角下落水救援检测数据集

无人机视角下落水救援检测数据集&#xff0c;利用无人机快速搜索落水者对增加受害者的生存机会至关重要&#xff0c;该数据集共收集12万帧视频图像&#xff0c;涵盖无人机高度从10m-60m高度&#xff0c;检测包括落水者&#xff08;11万标注量&#xff09;、流木&#xff08;900…

TCP/IP - ICMP

目录 1. 帧格式2. ICMPv4消息类型(Type = 0,Code = 0)回送应答 /(Type = 8,Code = 0)回送请求(Type = 3)目标不可达(Type = 5)重定向(Type = 11)ICMP超时(Type = 12)参数3. ICMPv6消息类型回见TCP/IP 对ICMP协议作介绍 ICMP(Internet Control Message Protocol…