zoukankan      html  css  js  c++  java
  • 18. 多继承语法及菱形继承

    多继承语法

    • C++ 允许一个类继承多个类(一个子类多个父类)————> C++ 实际开发中不建议用多继承
    • 语法:class 子类 : 继承方式 父类1,继承方式 父类2...
    • 注意:多继承可能会引发父类中有同名成员,需要加作用域区分
    #include <iostream>
    using namespace std;
    
    class Base1
    {
    public :
          Base1()
          {
                m_a = 100;
          }
          int m_a;
    };
    class Base2
    {
    public :
          Base2()
          {
                m_a = 100;
          }
          int m_a;
    };
    //子类继承Base1和Base2
    class Son : public Base1 , public Base2
    {
    public :
          Son()
          {
                m_c = 300;
                m_d = 400;
          }
          int m_c;
          int m_d;
    };
    void test01()
    {
          Son s;
          cout << "sizeof Son =" << sizeof (s) <<endl;
          // 当父类中出现同名成员,加作用域
          cout << "Base1 :: m_a " << s.Base1::m_a << endl;
          cout << "Base2 :: m_a " << s.Base2::m_a << endl;
    }
    int main()
    {
          test01();
          system("pause");
          return 0;
    }
    


    菱形继承

    概念:

    • 两个派生类继承同一个基类
    • 又有某个类同时继承者两个派生类
    • 这种继承被称为菱形继承或钻石继承

    我们来看一个小案例:假设有羊、驼、和羊驼三个动物,羊继承动物的数据,驼同样继承了动物的数据,当羊驼使用数据时,会产生二义性
    菱形继承的问题:羊驼继承了两份动物数据,但这份数据我们只需要一份就可以了
    可以利用虚继承来解决菱形继承的问题

    #include <iostream>
    using namespace std;
    class Animal
    {
    public:
          int m_age;
    };
    
    //羊类
    class Sheep: virtual public Animal
    {};
    
    //驼类
    class Tuo: virtual public Animal
    {};
    
    //羊驼类
    class SheepTuo: public Sheep,public Tuo
    {};
    void test01()
    {
          SheepTuo st;
          st.Sheep::m_age = 18;
          st.Tuo::m_age = 28;
          //当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分
          // 这份数据我们只需要一份,菱形继承导致数据有两份,造成资源浪费 ————> 利用虚继承解决菱形继承的问题
    
          cout << "st.Sheep :: m_age ="<< st.Sheep::m_age<< endl;
          cout << "st.Tuo0 :: m_age ="<< st.Tuo::m_age<< endl;
          cout << "st.m_age = " << st.m_age << endl;  // 发生虚继承后数据只有一个
    }
    int main()
    {
          test01();
          system("pause");
          return 0;
    }
    

    虚继承

    • 利用虚继承,解决菱形继承的问题
    • 继承之前加上关键字 virtual 变为虚继承
    • 此例题中,Animal 类称为虚基类
  • 相关阅读:
    线程同步之条件变量使用手记
    如何实现文件增量同步——算法
    javascript 复习笔记
    cocos2dx 多图层点击事件及管理相关问题记录
    cocos2dx 2.1.1 jsbinding 游戏帧数下降问题记录
    cocos2dx jsb + cocosbuilder 编译到安卓下问题处理(待续)
    cocos2dxjsb及Cocosbuilder使用相关问题处理记录
    cocos2dx jsb 的本地存储
    cocos2dxjsb 跨语言调用及第三方集成 过程记录
    cocos2dx 2.1.1 升级2.1.3版本 记录
  • 原文地址:https://www.cnblogs.com/BY1314/p/13038298.html
Copyright © 2011-2022 走看看