C++虚函数表指针在内存中的位置

news/2024/12/2 6:39:37/

C++虚函数表指针在内存中的位置

多态就是多种形态,C++的多态分为静态多态与动态多态。

  • 静态多态就是编译器根据函数实参的类型判断出要调用哪个函数。比如函数重载和函数模板。
  • 动态多态依靠的是虚函数表和动态绑定机制,因为是在运行时根据对象的类型在虚函数表中寻找调用函数的地址来调用相应的函数,所以称为动态多态。

C++是通过虚函数表来实现运行时多态的。通常所有声明为virtual的虚函数地址都被存放于该表中。编译器会为每个存在虚函数的类对象插入一个vtpr(virtul function pointer),该vptr指向存放了虚函数地址的虚函数表vtbl,这样对象在调用虚函数的时候,第一步会先根据vptr找到vbtl,然后根据该虚函数在vbtl中的索引来进行调用,这样就实现了运行时多态功能。也就是说,虚函数表是在编译期间就已经生成了!

虚函数表指针可以看成类中的一个成员变量,也应该占用一定的字节数(一般是4个或者8个字节)。既然该指针是类的成员变量,那么它在类的对象内存中就会有一个位置,它有可能位于对象内存的开头处,也有可能位于对象内存的末尾处,具体在什么位置取决于编译器。现在写一个范例,范例的目的是验证一下虚函数表和虚函数表指针的存在。
看看如下类A的定义代码:

#include <iostream>class A
{
public:int i;                         //一个成员变量,4字节virtual void testfunc() { std::cout << "virtual function testfunc!" << std::endl; }     //一个简单的虚函数
};int main()
{A a;int ilen = sizeof(a);   //8:i占4字节,虚函数表指针占4字节(皆在x86平台下)
}

现在可以确定一件事情,a对象里有一个虚函数表指针(vptr),还有一个成员变量i,成员变量是跟着对象走的,也就是说是属于该对象的。可以以图 2.5 做参照。
在 main主函数中继续增加如下的代码,用以感知一下虚函数表指针的存在。注意观察代码中的注释:

char* pl = reinterpret_cast<char*>(&a);     //0x006ff730类型转换这属于硬转,a是对象首地址
char* p2 = reinterpret_cast<char*>(&(a.i)); //0x006ff734
if(pl== p2)  //说明a和a位置相同则成员变量在a对象内存的上面位置那么虚丽数表指针在下面位置
{cout << "虚函数表指针位于对象内存的末尾" << endl;
}
else
{cout << "虚函数表指针位于对象内存的开头" << endl;  //本条件会成立
}

执行起来,看一看结果

虚函数表指针位于对象内存的开头

上面的代码比较简单。不难看到,经过测试,虚函数表指针位于对象内存的起始(上面开头)位置。在 Linux 操作系统下编译并运行程序,得到的结果也相同(虚函数表指针也位于对象内存的起始位置)。

通过上面这个范例,感知到了虚函数表指针的存在,后续就要通过这个虚函数表指针来尝试调用一下虚函数。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器


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

相关文章

智能开关面板行业概览

智能开关产品在全球市场的渗透率在2018年首次突破1%&#xff0c;并在之后的几年保持稳定的攀升态势。中国精装房自2019年开始逐步配置智能开关&#xff0c;直至2021年中国精装房智能开关配套率已达15%&#xff0c;作为智能家居最重要的交互入口之一&#xff0c;智能开关在未来的…

浅谈(零火)智能开关和(单火)智能开关的工作原理和优势区别

本文我们将浅谈(零火)智能开关和(单火)智能开关的工作原理和优势区别。在探讨这两类产品之前&#xff0c;小编先带大家了解一下"什么是智能开关?" 智能开关是指利用控制板和电子元器件的组合及编程&#xff0c;以实现电路智能开关控制的单元。在电子墙壁开关的基础上…

智能开关设计设计

智能插座设计方案 一、硬件 WIFI模块&#xff08;ESP8266&#xff09;、单片机&#xff08;stc12c5a60s2&#xff09;、4路5V继电器、插线板 二、技术 串口通信、android、C语言 三、实现方案 1、模块初始化 (1)、设置wifi模块为APStation模式&#xff08;设置模块作为路由…

el-switch开关

el-switch开关在表格中调用 效果图 注意&#xff1a;avue-switch在表格中用change事件可能会出现自动加载情况&#xff0c;用el-switch不会 1.加入el-switch标签并设置change事件 代码 <template slot"status" slot-scope"scope" > <el-…

HALL开关介绍

一、HALL开关原理及手机应用 手机中用来控制线路通断的器件主要有三种类型&#xff1a;开关、干簧管和霍尔元件。不同的是开关一般是由人工 手动控制&#xff0c;而干簧管和霍尔元件则通过磁信号来控制线路的通与断。霍尔&#xff08;HALL&#xff09;传感器是一种电子元件&…

智能家居Homekit系列一智能触摸开关

触摸开关&#xff0c;即通过触摸方式控制的墙壁开关&#xff0c;其感官场景如同我们的触屏手机&#xff0c;只需手指轻轻一点即可达到控制电器的目的&#xff0c;随着人们生活品质的提高&#xff0c;触摸开关将逐渐将换代传统机械按键开关。 触摸开关控制原理 触摸开关我们把…

Aqara 2021发布会:万物互联的家庭智慧全景

5月25日下午&#xff0c;全屋智能代表品牌Aqara在北京751DPARK时尚设计广场79罐举办了成立11年以来的首场品牌发布会。会上正式发布了一系列新技术、新场景与系统新能力&#xff0c;其中&#xff0c;Aqara智能管家——小乔首次亮相并充当发布会主持人角色&#xff0c;别开生面。…

智能家居迈向体验型市场,Aqara如何做到先行一步?

文|螳螂财经 作者| 余一 随着00后逐渐进入到适婚年龄&#xff0c;购置新房、居家装修等事宜也相对接踵而来。此前某互联网家装平台发布《2021装修消费趋势报告》显示&#xff0c;90后是当前互联网装修用户中的最大群体&#xff0c;占比达到39%&#xff0c;而00后正逐渐冒头占…