请选择 进入手机版 | 继续访问电脑版

[C 语言] 探究c++虚表实当代 码

  [复制链接]
查看163 | 回复53 | 2021-9-12 20:02:10 | 显示全部楼层 |阅读模式

本文简单探究虚表实现。

如下代码中有一个基类

  1. CPerson
复制代码
和子类
  1. CStudent:public
复制代码
.并有两个虚函数
  1. run
复制代码
  1. cry
复制代码

  1. #include<iostream>
  2. using namespace std;
  3. class CPerson {
  4. public:
  5. virtual void run() {
  6. cout << "Person is runing. \r\n";
  7. }
  8. virtual void cry() {
  9. cout << "Person is cry. \r\n";
  10. }
  11. };
  12. class CStudent:public CPerson {
  13. public:
  14. void run() {
  15. cout << "Student is runing. \r\n";
  16. }
  17. void cry() {
  18. cout << "Student is cry. \r\n";
  19. }
  20. };
  21. int main() {
  22. CPerson * pStudent = new CStudent();
  23. pStudent->run();
  24. getchar();
  25. return 0;
  26. }
复制代码

  1. VS
复制代码
  1. cl
复制代码
提供了对应下令 行查看类的内存布局。
语法
  1. cl /d1 reportSingleClassLayoutXXXX YYYY
复制代码
。此中 XXX为类名,
  1. YYYY
复制代码
为地点 文件全路径。
如本例:
  1. cl /d1 reportSingleClassLayoutCStudent \\Mac\Main.cpp
复制代码
输出如下:

在这里插入图片形貌

我们再看下

  1. CPerson
复制代码
的输出:

在这里插入图片形貌

上面的图大概 很抽象,大致的意思一个

  1. CStudent
复制代码
的内存地区 中的第一个内存地区 存放一个
  1. 4字节指针
复制代码
,指针指向一个另一个内存地区 ,这个内存地区 我们称为虚表。虚表内存布局 可以明白 为一个数组,数组中的每个元素是一个函数指针。指向函数地址。

示例图:

在这里插入图片形貌

空说无凭,我们使用 VS内存查看器和汇编器证明 猜测。

在这里插入图片形貌

上图简单来说就是:
(1) 构造了一个CStudent对象,地址为

  1. 0x00d88d28
复制代码

(2) 进入对象的地址,对象内存的第一个4字节地区 为
  1. 0x00f89b78
复制代码
,这个存储的数值为虚表指针位置。
(3) 进入虚表内存地址,发现存储了两个指针
  1. 0xf8105f
复制代码
  1. 0xf81406
复制代码
.

我们再次跳转到

  1. 0xf8105f
复制代码
内存地址,此时我们查看汇编级别代码。发现是一个jmp指令跳转到实际 CStudent::run函数.

在这里插入图片形貌

同理

  1. 0xf81406
复制代码
如下图所示:

在这里插入图片形貌

其他扩展知识:

虚表在编译时已经构造完成,在构造对象时,会根据对象的范例 在初始化时赋值虚表地址给对象的

  1. vfptr
复制代码
。我们把这种活动 称为动态绑定(Dynamic Binding)

到此这篇关于探究c++虚表实当代 码的文章就先容 到这了,更多干系 c++虚表内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 清风哥 | 2021-9-12 22:12:05 | 显示全部楼层
以后就跟admin楼主混了!
回复

使用道具 举报

avatar fdxhcwe148498 | 2021-9-18 03:18:03 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 紫愚灵 | 2021-9-19 21:01:58 | 显示全部楼层
世界末日我都挺过去了,看到admin楼主我才知道为什么上帝留我到现在!
回复

使用道具 举报

avatar 刘久田 | 2021-9-20 04:22:45 | 显示全部楼层
论坛的人气不行了!
回复

使用道具 举报

avatar 去火星三小时自 | 2021-9-26 23:32:50 | 显示全部楼层
上次给admin楼主开的药,你都吃完了?
回复

使用道具 举报

avatar 寒川 | 2021-9-29 00:12:57 | 显示全部楼层
admin楼主主机很热情啊!
回复

使用道具 举报

avatar 123457489 | 2021-9-29 00:13:00 | 显示全部楼层
记得吃药!
回复

使用道具 举报

avatar zmhg799417 | 2021-10-7 02:43:15 | 显示全部楼层
楼上的真不讲道理!
回复

使用道具 举报

avatar 123457776 | 2021-10-8 11:21:26 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则