news 2026/7/12 19:27:23

虚基表与虚继承的内存关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚基表与虚继承的内存关系

虚基表与虚继承的内存关系

一、虚继承的核心机制

虚继承通过虚基表(vbtable)虚基类指针(vbptr)来实现,确保菱形继承中只有一份虚基类副本。

二、内存结构对比

2.1 普通继承(无虚继承)的内存布局

classPerson{public:string name;// 假设 32 字节(64位系统)intage;// 4 字节};classTeacher:publicPerson{public:string course;// 32 字节};classStudent:publicPerson{public:intstuId;// 4 字节};classTeachingAssistant:publicTeacher,publicStudent{public:string dept;// 32 字节};

内存布局图解:普通菱形继承的内存布局(无虚继承)


2.2 虚继承的内存布局

classPerson{public:string name;// 32 字节intage;// 4 字节};// 虚继承classTeacher:virtualpublicPerson{public:string course;// 32 字节};classStudent:virtualpublicPerson{public:intstuId;// 4 字节};classTeachingAssistant:publicTeacher,publicStudent{public:string dept;// 32 字节};

虚继承内存布局图解

三、虚基表(vbtable)的结构

3.1 虚基表的内容

// 虚基表的结构(概念上)structVirtualBaseTable{ptrdiff_t offset_to_top;// 到对象顶部的偏移ptrdiff_t offset_to_virtual_base;// 到虚基类的偏移// 可能还有多个虚基类的偏移};

虚基表(vbtable)结构

TeachingAssistant 对象的虚基表 Teacher 的虚基表 (通过 Teacher::vbptr 指向) offset_to_top = 0 ← 从 Teacher 部分到对象顶部 offset_to_Person = 72 ← 到 Person 部分的偏移 ↑ Teacher::vbptr ─────┘ Student 的虚基表 (通过 Student::vbptr 指向) offset_to_top = -40 ← 从 Student 部分到对象顶部 offset_to_Person = 32 ← 到 Person 部分的偏移 ↑ Student::vbptr ────────┘

四、完整的内存偏移示例

#include<iostream>usingnamespacestd;classPerson{public:string name;intage;Person():name("Person"),age(0){}virtual~Person(){}};classTeacher:virtualpublicPerson{public:string course;Teacher():course("Math"){}};classStudent:virtualpublicPerson{public:intstuId;Student():stuId(100){}};classTeachingAssistant:publicTeacher,publicStudent{public:string dept;TeachingAssistant():dept("CS"){}};intmain(){TeachingAssistant ta;char*base=(char*)&ta;cout<<"=== 详细地址信息 ==="<<endl;cout<<"对象起始地址: "<<(void*)base<<endl;cout<<"Teacher 地址: "<<(void*)(Teacher*)&ta<<endl;cout<<"Student 地址: "<<(void*)(Student*)&ta<<endl;cout<<"Person 地址: "<<(void*)(Person*)(Teacher*)&ta<<endl;cout<<"\n=== 相对于对象起始的偏移 ==="<<endl;cout<<"Teacher 偏移: 0 字节"<<endl;cout<<"Student 偏移: "<<((char*)(Student*)&ta-base)<<" 字节"<<endl;cout<<"Person 偏移: "<<((char*)(Person*)(Teacher*)&ta-base)<<" 字节"<<endl;cout<<"\n=== 子对象之间的偏移 ==="<<endl;cout<<"Teacher → Person: "<<((char*)(Person*)(Teacher*)&ta-(char*)(Teacher*)&ta)<<" 字节"<<endl;cout<<"Student → Person: "<<((char*)(Person*)(Teacher*)&ta-(char*)(Student*)&ta)<<" 字节"<<endl;return0;}

典型输出(86位系统)

五、虚基表访问过程

5.1 通过 vbptr 访问虚基类成员

// 源代码ta.name="张三";// 编译器转换后的伪代码// 1. 通过 Teacher::vbptr 找到虚基表// 2. 从虚基表中读取到 Person 的偏移量// 3. 计算 Person 的实际地址// 4. 访问 name 成员// 等价于:ptrdiff_t offset=pTA->Teacher::vbptr->offset_to_Person;Person*pPerson=(Person*)((char*)pTA+offset);pPerson->name="张三";

访问流程图解

ta.name = "张三"; 步骤1:获取 Teacher 部分的 vbptr vbptr = ta.Teacher::vbptr (指向虚基表) 步骤2:从虚基表读取偏移量 offset = vbptr->offset_to_Person (例如 128 字节) 步骤3:计算 Person 的实际地址 pPerson = (char*)&ta + offset 步骤4:访问成员 pPerson->name = "张三"

六、虚继承的开销总结

开销类型普通继承虚继承
内存开销无额外开销每个虚基类子对象有一个 vbptr(8字节)
时间开销直接访问通过 vbptr 间接访问(多一次内存访问)
构造开销简单复杂(需要初始化 vbptr)
代码复杂度简单复杂

七、总结

概念说明
vbptr(虚基类指针)每个虚继承的子对象中存储,指向虚基表
vbtable(虚基表)存储虚基类相对于当前对象的偏移量
偏移量从当前对象起始位置到虚基类起始位置的距离
访问方式通过 vbptr → 虚基表 → 偏移量 → 计算地址 → 访问成员
主要目的解决菱形继承中的数据冗余和二义性问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 19:27:21

Linux系统基础7:系统目录结构详细详解

目录 Linux 系统目录结构 新手超详细详解 一、先搞懂 2 个基础概念 1. 绝对路径 vs 相对路径 2. 4 个必记特殊路径符号 二、核心目录逐个讲&#xff08;按功能分类&#xff0c;附实例&#xff09; 1. 最顶层&#xff1a;根目录 / 2. ⭐系统配置核心&#xff1a;/etc 3. …

作者头像 李华
网站建设 2026/7/12 19:26:28

零基础蓝队安全30天成长计划(防御运维方向)

&#x1f4cc; 三句大实话&#xff0c;读懂蓝队就业真相第一&#xff1a;蓝队是网安最大刚需岗位&#xff0c;就业率远超红队渗透。绝大多数企业不需要高危渗透人才&#xff0c;但100%需要安全运维、日志审计、漏洞修复、应急响应蓝队人员&#xff0c;稳就业、低门槛、长期吃香…

作者头像 李华
网站建设 2026/7/12 19:23:46

【SD Embedding 工业级部署指南】:从单卡训练到多节点分布式Embedding服务化,吞吐提升4.7倍的Kubernetes调度策略(含YAML配置模板)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;SD Embedding 工业级部署概述 Stable Diffusion&#xff08;SD&#xff09;Embedding 是一种轻量级、可插拔的文本特征调制机制&#xff0c;广泛用于个性化图像生成场景。在工业级部署中&#xff0c;其核心挑战…

作者头像 李华
网站建设 2026/7/12 19:20:50

GEM-X性能优化指南:如何提升单目视频处理速度与精度

GEM-X性能优化指南&#xff1a;如何提升单目视频处理速度与精度 【免费下载链接】GEM-X 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/GEM-X GEM-X作为NVIDIA推出的单目视频处理框架&#xff0c;在姿态估计和三维重建任务中表现卓越。本指南将分享6个实用技巧&…

作者头像 李华