ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

嵌入式学习笔记-菱形继承(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 Inheritance1.修改继承方式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); // 输出2464位含虚基表指针虚继承的底层原理编译器会为虚继承的类生成虚基类指针vbptr指向虚基类子对象。虚基类表vbtable存储偏移量信息。内存结构示例内存布局64位系统组成部分大小说明Bird部分8字节虚基类指针指向共享的AnimalMammal部分8字节虚基类指针指向同一个AnimalAnimal部分4字节int age内存对齐填充4字节按8字节对齐补齐总大小24字节### **构造顺序的特殊规则** 虚基类的构造函数**优先于所有非虚基类**调用 C Platypus p; // 调用顺序Animal() → Bird() → Mammal() → Platypus()
返回列表