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 类称为虚基类