改网站标题/黄页引流推广网站软件免费

改网站标题,黄页引流推广网站软件免费,装饰画图片大全,wordpress菜单栏移动下移目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中,我们介绍了C三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将…

目录

前言

多态的原理

动态绑定与静态绑定

虚函数表

小结


前言

在前面的文章中,我们介绍了C++三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将着重介绍C++多态的实现原理。

相关参考文章如下:

C++从入门到入土(七)——多态

多态的原理

我们在前面的文章中了解到多态的实现条件有以下两个:

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

2.被调用的函数必须是虚函数,并且完成了重写

看到上面两个条件,我们不禁会发出疑问,为什么必须是通过基类的指针或引用调用虚函数呢?为什么不能通过其他条件构成多态呢?那么我们通过下面代码来讨论这两个问题:

class Base
{
public:virtual void Func(){cout << "基类调用" << endl;}
protected:int _base;
};class A:public Base
{
public:virtual void Func(){cout << "派生类调用" << endl;}
private:int _a;
};void Print(Base& a)
{a.Func();
}int main()
{Base b;Print(b);A a;Print(a);return 0;
}

首先我们看到上述一段简单的代码,其运行结果如下所示:

我们进入调试观察一下它的内部:

我们可以看到,相比于没有实现多态的类,其底层多了一个_vfptr的对象,那这个对象是什么呢?直接讲结论:这个对象是虚函数表(v表示virtual,f表示function,ptr表示指针),其本质是一个指针数组。

那么我们此时就可以猜测,是不是因为虚函数表的出现导致多态行为的发生呢?我们再仔细观察一下会发现,派生类的虚函数表保存在基类base之下,但是他们的地址是不同的,那么虚函数表中存储的是什么呢?实际上虚函数表中存的是虚函数的地址。当我们满足多态的条件后,我们在编译时不再通过调用对象来确定函数的地址,而是运行时到指向对象的虚函数表中确定虚函数的地址,这样就实现了基类的指针或引用调用不同函数的目的

动态绑定与静态绑定

我们在粗略理解了多态的原理后,接下来我们引入动态绑定与静态绑定的概念帮助我们更加深入地理解多态地原理.。

首先我们要理解什么是动态与静态绑定。

静态绑定:在编译时就确定函数的地址就叫静态绑定,换句话说就是不满足多态的函数调用,例如:函数重载、模板等。

动态绑定:在运行时通过虚函数表来确定函数的地址就叫动态绑定,例如:多态。

所以可以这么说,动态绑定是多态的特点之一。

虚函数表

还是以上面的例子,我们发现,派生类和基类在实例化的过程中分别产生了不同的虚函数表,即使派生类继承了基类的对象,但是派生类的虚函数表中并没有保存基类虚函数的地址,我们将虚函数表的地址输入到内存窗口中查看:

 我们可以看到,基类和派生类的虚函数表中保存的地址是不同的,不同的类的虚表也是不同的。

我们给派生类再加一个虚函数,进入调试,观察一下:

当我们给基类添加了一个虚函数后发现,虚函数表中又存储了一个地址,但是对于基类而言只有一个虚函数的地址,那么我们可以得出下面的结论:

派生类的虚函数表中包含<1.>基类虚函数的地址 <2.>派生类重写的虚函数的地址的覆盖 <3.>自己的虚函数的地址

综上所述,对于虚函数表的结论如下:

1.基类对象的虚函数表存放基类所有虚函数的地址,同类型的对象共用一张虚函数表,不同类型的对象各有自己的虚函数表,即:基类和派生类各有自己的虚函数表

2.虚函数表中包含:基类虚函数的地址;  派生类重写的虚函数的地址的覆盖; 派生类自己的虚函数

3.虚函数表本质是一个函数指针数组,存放虚函数的地址

4.虚函数存放在代码段,虚函数的地址存放在虚函数表,虚函数表指针存放在对象中

小结

本篇文章我们介绍了多态的实现原理,动态绑定以及虚函数表,通过本篇博客的阅读相信您对多态的认识会更加清楚,如果本篇文章对您有所帮助的话希望能够点赞、关注加转发,您的支持就是我创作的最大动力。  

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

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

相关文章

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

植物知识分享论坛毕设

1.这四个文件直接是什么关系&#xff1f;各自都是什么作用&#xff1f;他们之间是如何联系的&#xff1f; 关系与联系 UserController.java 负责接收外部请求&#xff0c;调用 UserService.java 里的方法来处理业务&#xff0c; 而 UserService.java 又会调用 UserMapper.jav…

Business processes A bridge to SAP and a guide to SAP TS410 certification

Business processes A bridge to SAP and a guide to SAP TS410 certification

算法 之 ST表

文章目录 区间最大值 ST表(Sparse Table)是一种高效处理静态数据区间查询的数据结构&#xff0c;主要的作用是用于快速查询区间的最值&#xff0c;区间GCD,区间按位与或 在这里以区间最大值为例子说明st表的模版 总体的思想就是定义dp[i][j]表示下标为i长度为2^j的区间的最大值…

Deepseek X 文心智能体:谐音梗广告创意大师

体验链接 飞书文档 一、引言 在当今竞争激烈的市场环境下&#xff0c;广告创意对于产品或服务的推广至关重要。谐音广告以其独特的语言魅力&#xff0c;能够迅速吸引受众的注意力并留下深刻印象。本智能体旨在利用 DeepSeek 模型强大的语言分析和推理能力&#xff0c;为用户…

TCP简单链接的编程实现

TCP简单链接的编程实现 本文主要介绍TCP应用层的编码实现。 TCP是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;它是互联网协议套件&#xff08;TCP/IP&#xff09;中的核心协议之一&#xff0c;广泛应用于需要可靠数据传输的场景&#xff0c;如&#xff1a;网…

【RHCE实验】搭建主从DNS、WEB等服务器

目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始&#xff0c;提供开箱即用的开发体验&#xff0c;将SD…

nodejs使用 mysql2 模块获取 mysql 中的 json字段,而不是 mysql

mysql 模块获取的 json 字段&#xff0c;是字符串mysql2 模块获取的 json 字段&#xff0c;是符合预期的 json 对象 mysql mysql2 最后编辑于&#xff1a;2025-02-24 22:16:53 © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦&#xff01;…

【网工第6版】第1章 计算机网络概论

目录 1计算机网络形成和发展 ■计算机网络 ■我国互联网发展 ■计算机网路分类 ■计算机网络应用 2 OSI和TCP/IP参考模型 ■网络分层的意义 ■OSI参考模型 ■TCP/IP参考模型 ■TCP/IP参考模型协议 3 数据封装与解封过程 ■封装 ■解封 1计算机网络形成和发展 ■计…

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以&#xff0c;去哪些地方可以找数据手册 一个例子&#xff1a;STM32F103C8T6 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

AndroidStudio+Android8.0下的Launcher3 导入,编译,烧录,调试

文章目录 编译完成搜索输出文件Android.mk配置gradle编译环境报错一报错二报错三输出文件下载INSTALL_FAILED_TEST_ONLY查找系统签名查找签名工具开始签名查看签名签名问题重新生成秘钥解决方案生成成功挽救错误:重新刷机更换testkey秘钥keystore生成keystoreINSTALL_FAILED_S…

Linux--gdb/cgdb

ok&#xff0c;我们今天学习gdb的安装和使用 调试器-gdb/cgdb使用 VS、VScode编写的代码一般都是release格式的&#xff0c;gdb 的格式一般是debug 换成debug模式命令 :-g gdb会记录最新的一条命令&#xff0c;直接回车就是默认执行该命令 一个调试周期下&#xff0c;断点…

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…

【操作系统安全】任务2:用户与用户组

目录 一、用户与用户组介绍 1.1 用户 1.2 用户组 1.3 用户与用户组的关系 二、用户与用户组管理 2.1 用户管理 2.1.1 创建用户 2.1.2 设置用户密码 2.1.3 删除用户 2.2 用户组管理 2.2.1 创建用户组 2.2.2 删除用户组 2.2.3 将用户添加到用户组 三、影子账户创建…

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节&#xff0c;通过结合空间域和频率域的处理&#xff0c;提升图像中特定细节…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

Pycharm 社区版安装教程

找到安装包双击安装文件---点击下一步 一般路径是&#xff1a;C:\Rambo\Software\Development 选择完成后就是如下地址&#xff1a; C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…