c++_ 多态

news/2024/12/22 0:22:04/

目录

一.多态

1.1多态(polymorphism)的概念

1.2实现多态还有两个必须重要条件:

1.3 重载 和 虚函数的重写/覆盖 和 隐藏 的比对

1.4 协变(了解)

1.5 析构函数的重写

1.6  override 和final关键字

二.纯虚函数和抽象类

三. 多态的原理

3.1虚函数表指针

3.2 虚函数表概念


一.多态
 

1.1多态(polymorphism)的概念

多态(polymorphism)的概念:多态分为 编译时多态 (静态多态 )运行时多态 (动态多态)
编译时多态 ,(静态多态) 主要就是 函数重载 和 函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。之所以叫 编译时多态(动态多态),是因为他们 实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。


1.2实现多态还有两个必须重要条件:

~ 第⼀必须是 基类的指针或引用,因为只有 基类的指针 或 引用 才能既指向派生类对象

~ 第二 派生类 必须对 基类 的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多
态的不同形态效果才能达到

注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性),但是该种写法不是很规范。

不规范的写法,考试容易出现

规范写法:比如

不规范的写法:比如


1.3 重载 和 虚函数的重写/覆盖 和 隐藏 的比对

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

重载 函数名字相同参数的 类型 和 个数不同  、返回值都可以。

隐藏 函数名字相同 、但不构成 重新/覆盖 。


1.4 协变(了解)


派生类重写基类虚函数时,与基类虚函数 返回值类型 不同。

1.5 析构函数的重写

基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以只要基类的析构函数加了vialtual修饰,派生类的析构函数就构成重写。(知道最后一句就行)


1.6  override 和final关键字
 

C++11提供了override,可以帮助用户 检测 是否 重写。


我们 不想让 派生类重写 这个 虚函数,那么可以用 final 去修饰


二.纯虚函数和抽象类

在虚函数的后⾯写上 =0 ,则这个函数为纯虚函数。纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),只要声明即可。纯虚函数某种程度上强制了派生类重写虚函数,因为纯虚函数,实例化不出对象。比如:

结果:


三. 多态的原理
 

3.1虚函数表指针

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

比如:

3.2 多态的原理

每个实例化的对象,运行时都有自己的虚表,运行时到指向的对象的虚表中 确定 对应的虚函数的地址,这样就实现了 指针或引用 指向基类就调用基类的虚函数,如果 指向派生类就调用派生类 对应的虚函数。

父类的虚表地址:

子类的虚表地址:

3.2 虚函数表概念


• 基类对象的虚函数表中 存放 基类所有 虚函数的地址。
• 派生类由两部分构成继承下来的基类 自己的成员。⼀般情况下,继承下来的基类中有虚函数表指针,自己就不会再生成虚函数表指针。但是要注意的这里继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派生类对象中的基类对象成员也独立的。
• 派生类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。生类的虚函数表中包含基类的虚函数地址派生类重写的虚函数地址派生类自己的虚函数地址 三个部分。
• 虚函数表本质是⼀个存虚函数指针的 指针数组


http://www.ppmy.cn/news/1534954.html

相关文章

SolidWorks机器转ROS2 URDF

文章目录 开发环境SolidWords插件使用生成urdf文件之后的处理CMakeLists文件修改package.xml变更Launch更改运行 开发环境 Linux系统:Ubuntu 22.04 Ros2版本:humble Solidwords版本:2023 (2019以上版本应该都是可以的&#xff09…

【CKA】二、节点管理-设置节点不可用

2、节点管理-设置节点不可用 1. 考题内容: 2. 答题思路: 先设置节点不可用,然后驱逐节点上的pod 这道题就两条命令,直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情: –delete-empty…

gm/ID设计方法学习笔记(一)

前言&#xff1a;为什么需要gm/id &#xff08;一&#xff09;主流设计方法往往侧重于强反型区&#xff08;过驱>0.2V&#xff09;&#xff0c;低功耗设计则侧重于弱反型区&#xff08;<0&#xff09;&#xff0c;但现在缺乏对中反型区的简单和准确的手算模型。 1.对于…

DualGS:高效人体体积视频渲染技术,实现复杂4D数字人表演的实时播放引言

随着虚拟现实(VR)和增强现实(AR)技术的发展,对高质量、低延迟的人体体积视频的需求日益增长。传统的视频压缩和渲染方法在处理复杂的4D人体动作时往往面临性能瓶颈。为了解决这一问题,研究人员开发了一种名为DualGS的新型高效人体体积视频渲染技术。本文将详细介绍DualGS…

Effective C++中文版学习记录(二)

Effective C中文版学习记录&#xff08;二&#xff09; 章节二&#xff1a;构造/ 析构/ 赋值运算 进度&#xff1a;12/55 文章目录 Effective C中文版学习记录&#xff08;二&#xff09;条款05、了解C默默编写并调用哪些函数条款06、若不想使用编译器自动生成的函数&#xf…

C++:图的最小生成树

一、简介 连通图的生成树是包含图中全部顶点的一个极小连通子图。极小的含义是包含全部顶点的连通子图中&#xff0c;边数最小的子图。一颗具有n个顶点的生成树&#xff0c;有且仅有n-1条边。显然&#xff0c;生成树可能不唯一。 无向连通网的生成树上各边的权值之和称为该生成…

如何使用C语言接入Doris数据库

如何使用C语言接入Doris数据库 一、环境准备1. 安装MySQL C API2. Doris数据库环境二、编写C语言接入代码1. 包含必要的头文件2. 编写连接和查询函数3. 编译和运行程序三、注意事项1. 安全性2. 错误处理3. 性能优化4. 兼容性5. 调试和日志记录四、结论Doris(之前称为Palo或Apa…

爬虫prc技术----小红书爬取解决xs

知识星球&#xff1a;知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具知识星球是创作者连接铁杆粉丝&#xff0c;实现知识变现的工具。任何从事创作或艺术的人&#xff0c;例如艺术家、工匠、教师、学术研究、科普等&#xff0c;只要能获得一…