当前位置: 首页 > news >正文

关于C++多重继承下虚表结构的问题

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

classParentA {

public:

inta=0x123456;

virtualvoidvFunParentA(){

std::cout <<"vFunParentA"<< std::endl;

}

};

classParentB {

public:

intb = 0x456;

virtualvoidvFunParentB() {

std::cout<<"vFunParentB"<<std::endl;

inti = 0;

}

};

classChild:publicParentA,publicParentB {

intc = 0x789;

};

intmain()

{

//注意这里使用void*

void* pChild =newChild;

//强转

ParentB* pParentB = (ParentB*)pChild;

//强转

ParentA* pParentA = (ParentA*)pChild;

pParentB->vFunParentB();

pParentA->vFunParentA();

getchar();

}

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

vFunParentB
vFunParentA

但实际输出:

vFunParentA
vFunParentA

当时百思不得其“姐”,最后发现是自己对多重继承下的虚表内存结构不够了解。

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

在多重继承下Child内存结构应该是如下结构:

由于我们使用void *类型强转为ParentBParentA返回的指针地址依然是ParentA,而没有做内存偏移计算.如下图所示:

当我们不适用void*强转后编译器会帮我进行偏移计算会迫使ParentB偏移8字节,从而使pParentB指向正确的内存虚表。

在单一继承下不会出现这类问题,我们最后看下本例中的内存结构:



到此这篇关于关于C++ 多重继承下虚表结构的问题的文章就介绍到这了

http://www.cnnetsun.cn/news/3161105.html

相关文章:

  • Redis分布式锁进阶第三十七篇
  • 奇迹 MU 剑与翼手游官网下载:奇迹 MU 剑与翼最新官方下载渠道
  • SRC漏洞挖掘入门:8种实战姿势与零基础进阶路径
  • Three.js 城市光影教程
  • 数学的本质是什么?——数学为什么如此不可思议地有效-龍德明宇
  • 主动推理-信息组织
  • SpringBoot3.x新特性解读与迁移指南
  • 影刀RPA深度教程:异常处理与调试完全指南
  • 泳池设备品牌哪家好
  • 《欠你的那场婚礼》 台剧|在线观看|电视剧|夸克|下载|豆瓣
  • 嵌入式系统2x2矩阵键盘设计与74HC32应用
  • 模型回滚流程:版本能切回去,数据也要对得上
  • LangGraph 工作流:用业务场景检验技术取舍
  • 2026年GEO贴牌代理源码解构:核心状态机深度拆解
  • SpringBoot项目从开发到部署的完整指南
  • Java分布式架构设计方法
  • Allegro PCB设计环境搭建与高速布线实战指南
  • 互联网大厂 Java 求职者面试:音视频领域的挑战与机遇
  • OpenCV核心接口与图像处理实战指南
  • 基于YOLOv8的铁轨障碍物智能检测系统实战指南
  • NSED协议:分布式共识与AI协同决策的创新实践
  • YOLO与3D点云融合:从环境搭建到2D-3D关联实战指南
  • 开源云WAF部署与配置实战:防渗透、防CC、防漏洞攻击
  • 基于YOLO的智能麻将识别:从数据标注到模型部署全流程实战
  • Windows系统深度优化架构与最佳实践方案:Win11Debloat技术解析
  • YOLO26目标检测实战:从环境搭建到自定义数据集训练全流程
  • YOLO目标检测从入门到实战:环境搭建、模型训练与10大项目应用
  • AI分布式训练中的集体通信操作与网络内计算优化
  • WeChatMsg技术实现:微信聊天记录解析与数据资产化的架构解析
  • 计算机视觉工具链:OpenCV、OpenGL与PyQt实战指南