news 2026/9/4 6:40:35

嵌入式学习笔记-菱形继承(Diamond Problem)的深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式学习笔记-菱形继承(Diamond Problem)的深度解析

问题本质

当派生类通过多条路径继承同一个基类时,会导致:

  • 数据冗余:派生类中包含多份基类的成员(浪费内存)。
  • 二义性:访问基类成员时,编译器无法确定使用哪一条继承路径的成员。

代码实现:

class Animal { public: int age; }; class Bird : public Animal {}; class Mammal : public Animal {}; class Platypus : public Bird, public Mammal {}; // 菱形继承

问题复现

Platypus p; // p.age = 5; // 错误:ambiguous access of 'age'(二义性) cout << sizeof(p); // 输出8(包含两份Animal::age)

解决方案:虚继承(Virtual Inheritance)

1.修改继承方式
class Bird : virtual public Animal {}; // 虚继承 class Mammal : virtual public Animal {}; class Platypus : public Bird, public Mammal {};
2.内存布局变化
  • 普通继承Platypus包含两份Animal子对象。
  • 虚继承Platypus通过虚基类指针共享唯一Animal子对象

验证:

Platypus p; p.age = 5; // 合法,无二义性 cout << sizeof(p); // 输出24(64位)(含虚基表指针)

虚继承的底层原理

编译器会为虚继承的类生成:

  • 虚基类指针(vbptr):指向虚基类子对象。
  • 虚基类表(vbtable):存储偏移量信息。

内存结构示例:

内存布局(64位系统)
组成部分大小说明
Bird部分8字节虚基类指针(指向共享的Animal)
Mammal部分8字节虚基类指针(指向同一个Animal)
Animal部分4字节int age
内存对齐填充4字节按8字节对齐补齐
总大小24字节
### **构造顺序的特殊规则** 虚基类的构造函数**优先于所有非虚基类**调用: ```C++ Platypus p; // 调用顺序:Animal() → Bird() → Mammal() → Platypus()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 6:40:21

原生前端三件套构建小区物业管理系统:从CRUD到localStorage数据持久化

简介&#xff1a;这是一套面向前端初学者与物业信息化实践者的HTML5小区物业管理系统设计源码&#xff0c;聚焦于纯前端实现的轻量级服务平台&#xff0c;解决传统小区信息分散、服务响应慢、居民交互弱等管理痛点&#xff0c;适用于课程设计、毕业设计及小型社区数字化改造场景…

作者头像 李华
网站建设 2026/9/4 6:38:20

Re:Linux 系统篇(十六):进程篇(五):O (1) 调度算法深度解析 —— 优先级数组、位图优化与活跃 / 过期双队列

观众老爷们大家好 这里是邪修KING的独家频道本文属于系列Linux系统篇 ——操作指令一起学Linux的小伙伴可订阅专栏&#xff1a; Linux系统篇 上一篇我们讲透了进程上下文切换的完整流程。切换谁、选哪个进程上 CPU&#xff0c;这件事由调度器决定。 早期 Linux 调度器很简单&am…

作者头像 李华
网站建设 2026/9/4 6:38:15

手机随拍实战:从港口船舶记录到专业纪实短片制作全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 6:35:11

Simulink同步发电机励磁与调速控制系统仿真实践指南

简介&#xff1a;本资源是一套面向电气工程专业本科生课程设计与毕业设计的同步发电机控制系统实践方案&#xff0c;聚焦励磁调节与原动机调速两大核心控制问题&#xff0c;帮助学习者掌握电力系统动态建模、反馈控制设计及Simulink工程实现能力。压缩包共19个文件&#xff0c;…

作者头像 李华
网站建设 2026/9/4 6:35:10

EviAnn v2.0.5 安装与使用--生信工具111

EviAnn—— 基于证据的真核生物基因组注释软件 EviAnn&#xff08;Evidence Annotation&#xff09;是一款全新的基因组注释软件&#xff0c;完全基于证据驱动。EviAnn 利用 RNA‑seq 数据、转录本序列以及近缘物种蛋白比对结果&#xff0c;完成蛋白编码基因与长非编码 RNA 的…

作者头像 李华
网站建设 2026/9/4 6:34:42

Claude访问真实系统事件复盘:权限边界与沙箱隔离

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华