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

[C 语言] 关于C++多重继承下虚表布局 的题目

[复制链接]
查看53 | 回复6 | 2021-9-12 19:50:14 | 显示全部楼层 |阅读模式

前言

昨天写一个项目时遇到 一个很诡异的征象 如下代码所示:

  1. class ParentA {
  2. public :
  3. int a=0x123456;
  4. virtual void vFunParentA(){
  5. std::cout << "vFunParentA" << std::endl;
  6. }
  7. };
  8. class ParentB {
  9. public:
  10. int b = 0x456;
  11. virtual void vFunParentB() {
  12. std::cout<<"vFunParentB"<<std::endl;
  13. int i = 0;
  14. }
  15. };
  16. class Child:public ParentA,public ParentB {
  17. int c = 0x789;
  18. };
  19. int main()
  20. {
  21. //注意这里使用void*
  22. void* pChild = new Child;
  23. //强转
  24. ParentB* pParentB = (ParentB*)pChild;
  25. //强转
  26. ParentA* pParentA = (ParentA*)pChild;
  27. pParentB->vFunParentB();
  28. pParentA->vFunParentA();
  29. getchar();
  30. }
复制代码

现在 实行 后我们的预期输出为

  1. vFunParentB
  2. vFunParentA
复制代码

但实际 输出:

  1. vFunParentA
  2. vFunParentA
复制代码

当时百思不得其“姐”,末了 发现是本身 对多重继承下的虚表内存布局 不够相识 。

博主另一外一篇关于虚表的:
c-15 c++虚表

在多重继承下

  1. Child
复制代码
内存布局 应该是如下布局 :

在这里插入图片形貌

由于我们使用

  1. void *
复制代码
范例 强转为
  1. ParentB
复制代码
  1. ParentA
复制代码
返回的指针地址依然是
  1. ParentA
复制代码
,而没有做内存偏移计算.如下图所示:

在这里插入图片形貌

当我们不实用

  1. void*
复制代码
强转后编译器会帮我举行 偏移计算会迫使
  1. ParentB
复制代码
偏移8字节,从而使
  1. pParentB
复制代码
指向准确 的内存虚表。

在这里插入图片形貌

在单一继承下不会出现这类题目 ,我们末了 看下本例中的内存布局 :

在这里插入图片形貌

在这里插入图片形貌

在这里插入图片形貌

在这里插入图片形貌

到此这篇关于关于C++ 多重继承下虚表布局 的题目 的文章就先容 到这了,更多相干 C++ 多重继承虚表内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


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

本帖子中包含更多资源

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

x
回复

使用道具 举报

avatar 绚丽源自寂寞悍 | 2021-9-12 22:09:13 | 显示全部楼层
在这个版块混了这么久了,第一次看见这么给你的帖子!
回复

使用道具 举报

不灌水就活不下去了啊!
回复

使用道具 举报

avatar 塔米酉 | 2021-9-27 00:17:00 | 显示全部楼层
admin楼主加油,看好你哦!
回复

使用道具 举报

avatar Vonice | 2021-10-8 21:58:02 | 显示全部楼层
最近精神病院在打折,admin楼主去看看吧?
回复

使用道具 举报

avatar fdxhcwe148498 | 2021-10-8 21:58:04 | 显示全部楼层
看在admin楼主的面子上,认真回帖!
回复

使用道具 举报

avatar 狒狒V | 4 天前 | 显示全部楼层
以后要跟admin楼主好好学习学习!
回复

使用道具 举报

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

本版积分规则