写点什么

C++ 继承中的多继承语法与菱形继承

作者:CtrlX
  • 2022 年 8 月 17 日
    山东
  • 本文字数:926 字

    阅读完需:约 3 分钟

C++继承中的多继承语法与菱形继承

多继承语法

C++允许一个类继承多个类


语法: class 子类 :继承方式 父类1 , 继承方式 父类2...


多继承可能会引发父类中有同名成员出现,需要加作用域区分


C++实际开发中不建议用多继承


示例:


class Base1 {public:  Base1()  {    m_A = 100;  }public:  int m_A;};
class Base2 {public: Base2() { m_A = 200; //开始是m_B 不会出问题,但是改为mA就会出现不明确 }public: int m_A;};
//语法:class 子类:继承方式 父类1 ,继承方式 父类2 class Son : public Base2, public Base1 {public: Son() { m_C = 300; m_D = 400; }public: int m_C; int m_D;};

//多继承容易产生成员同名的情况//通过使用类名作用域可以区分调用哪一个基类的成员void test01(){ Son s; cout << "sizeof Son = " << sizeof(s) << endl; cout << s.Base1::m_A << endl; cout << s.Base2::m_A << endl;}
int main() {
test01();
system("pause");
return 0;}
复制代码


总结: 多继承中如果父类中出现了同名情况,子类使用时候要加作用域

菱形继承

菱形继承概念:


​ 两个派生类继承同一个基类


​ 又有某个类同时继承者两个派生类


​ 这种继承被称为菱形继承,或者钻石继承


典型的菱形继承案例:



菱形继承问题:



    示例:


    class Animal{public:  int m_Age;};
    //继承前加virtual关键字后,变为虚继承//此时公共的父类Animal称为虚基类class Sheep : virtual public Animal {};class Tuo : virtual public Animal {};class SheepTuo : public Sheep, public Tuo {};
    void test01(){ SheepTuo st; st.Sheep::m_Age = 100; st.Tuo::m_Age = 200;
    cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl; cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl; cout << "st.m_Age = " << st.m_Age << endl;}

    int main() {
    test01();
    system("pause");
    return 0;}
    复制代码


    vbptr 全称:virtual base pointer 虚基类指针,指向 vbtable ,virtual base table 虚基类列表。



    使用了虚继承后对比未使用虚继承解决菱形继承



    总结:


    • 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义

    • 利用虚继承可以解决菱形继承问题

    发布于: 刚刚阅读数: 2
    用户头像

    CtrlX

    关注

    Pain is inevitable,suffering is optional 2022.08.01 加入

    【个人网站】ctrlx.life 【联系方式】微信:gitctrlx 【软件技能】前端,C++,Python,研究网络工程,数据结构与算法。

    评论

    发布
    暂无评论
    C++继承中的多继承语法与菱形继承_c_CtrlX_InfoQ写作社区