尽管大多数应用程序都使用单个基类的公用继承,但有些时候单继承是不够用的,因为可能无法为问题域建模或对模型带来不必要的复杂性。在这种情况下,多重继承可以更直接地为应用程序建模。
  一、基本概念
  多重继承是从多于一个直接基类派生类的能力,多重继承的派生类继承其父类的属性。
  class ZooAnimal{
  };
  class Bear : public ZooAnimal{
  };
  class Endangered{
  };
  class Panda : public Bear, public Endangered{
  };
  注意:
  (1)与单继承一样,只有在定义之后,类才可以用作多重继承的基类。
  (2)对于类可以继承的基类的数目,没有语言强加的限制,但在一个给定派生列表中,一个基类只能出现一次。
  1、多重继承的派生类从每个基类中继承状态
  Panda ying_yang("ying_yang");
  对象ying_yang包含一个Bear子类对象、一个Endangered子类对象以及Panda类中声明的非static数据成员。如下图所示:

  2、派生类构造函数初始化所有基类
  派生类构造函数可以早构造函数初始化式中给零个或多个基类传递值。
  Panda::Panda(string name, bool onExhibit)
  : Bear(name, onExhibit, "Panda"),
  Endangered(Endangered::critical){}
  构造函数初始化式只能控制用于初始化基类的值,不能控制基类的构造次序。基类构造函数按照基类构造函数在类派生列表中的出现次序调用。对于Panda,基类初始化次序是:
  (1)ZooAnimal。
  (2)Bear,第一个直接基类。
  (3)Endangered,第二个直接基类,它本身没有基类。
  (4)Panda,初始化本身成员,然后运行它的构造函数的函数体。
  注意:构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。例如:
  Panda::Panda() : Endangered(Endangered::critical){}
  这个构造函数将隐式调用Bear的默认构造函数,尽管它不出现在构造函数初始化列表中,但仍然在Endangered类构造函数之前调用。
  3、析构的次序
  按照构造函数运行的逆序调用析构函数。Panda、Endangered、Bear,ZooAnimal。