C++11&QT复习 (九)

虚拟继承

    • **Day7-3 C++ 中的虚拟继承详解**
      • **一、为什么虚拟继承能解决存储二义性?**
        • **1. 问题的根源:菱形继承**
          • **问题1:数据冗余**
          • **问题2:访问二义性**
        • **2. 虚拟继承的解决方案**
          • 效果:
        • **3. 实现原理**
          • **虚基类指针(vbptr)**
          • **虚基类表(vbtable)**
          • **构造顺序**
      • **二、什么场景需要用到虚拟继承?**
        • **1. 菱形继承结构**
          • **公共基类的复用**
          • **接口类继承**
        • **2. 示例场景**
      • **三、注意事项**
        • **1. 性能开销**
        • **2. 构造函数调用**
        • **3. 避免滥用**
      • 总结

Day7-3 C++ 中的虚拟继承详解

一、为什么虚拟继承能解决存储二义性?

1. 问题的根源:菱形继承

假设存在以下继承关系:

class A {
    public: int x; };
class B : public A {
   };
class C : public A {
   };
class D : public B, public C {
   };
问题1:数据冗余

D 通过 BC 间接继承了两次 A,导致 D 对象中包含两份 A 的成员(B::A::xC::A::x)。

问题2:访问二义性

当直接访问 D 中的 x 时,编译器无法确定是通过 B 还是 C 路径继承的 x,导致编译错误:

 
 

你可能感兴趣的:(QT_C++,c++,开发语言)