1.多重继承定义
class derived_class_name: public base_class_name1,...{//...};
说明:继承列表中的访问级别可以是public,protected,private
2.大多重继承下,派生类的对象包含每个基类的基类子对象
3.构造派生类型的对象包括构造和初始化它的所有基类子对象
4.基类构造函数按照构造在类派生列表中的出现次序调用
示例:
/*file:animal.hauthor:longsy*/#include <iostream>class ZooAnimal {public: ZooAnimal(){ std::cout << "ZooAnimal" << std::endl; } virtual ~ZooAnimal(){ std::cout << "~ZooAnimal" << std::endl; }};class Bear : public ZooAnimal {public: Bear(){ std::cout << "Bear" <<std::endl; } virtual ~Bear(){ std::cout << "~Bear" << std::endl; }};class Endangered{public: Endangered() { std::cout << "Endangered" << std::endl; } virtual ~Endangered() { std::cout << "~Endangered" << std::endl; }};class Panda : public Bear, public Endangered {public: Panda() { std::cout << "Panda" << std::endl; } virtual ~Panda() { std::cout << "~Panda" << std::endl; }};
测试代码
/*file:test.cppauthor:longsy*/#include "animal.h"int main(){ Panda p; return 0;}/*ZooAnimalBearEndangeredPanda~Panda~Endangered~Bear~ZooAnimal*/
5.转换:派生类的指针或引用可以转换为其任意基类的指针或引用
在转换过程中是向上逐渐转换,对于多重继承要注意转换二义性
示例:
/*file:test1.cppauthor:longsy*/#include "animal.h"#include <iostream>void shout(const ZooAnimal &animal) { std::cout << "animal begins to shout!" << std::endl; }void shout(const Bear &bear) { std::cout << "the bear is shouting!" << std::endl;}int main(){ Panda p; shout(p); //shout(const Bear &bear) return 0;}
二义性示例:
/*file:test2.cppauthor:longsy*/#include "animal.h"#include <iostream>void shout(const Bear &bear) { std::cout << "the bear is shouting!" << std::endl;}void shout(const Endangered&) { std::cout << "the endangered is shouting!" << std::endl;}int main(){ Panda p; shout(p); //error:存在二义性 return 0;}
6.多重继承下的多态(虚函数的调用)
同时多重继承下也会出现二义性
示例:
/*file:animal.hauthor:longsy*/#include <iostream>class ZooAnimal {public: ZooAnimal(){ std::cout << "ZooAnimal" << std::endl; } virtual ~ZooAnimal(){ std::cout << "~ZooAnimal" << std::endl; } virtual void shout() {std::cout <<"animal shout" << std::endl;}};class Bear : public ZooAnimal {public: Bear(){ std::cout << "Bear" <<std::endl; } virtual ~Bear(){ std::cout << "~Bear" << std::endl; } //如果基类指明了vritual,这里的vritual可以省略 virtual void shout() { std::cout <<"bear shout" << std::endl; }};class Endangered{public: Endangered() { std::cout << "Endangered" << std::endl; } virtual ~Endangered() { std::cout << "~Endangered" << std::endl; }};class Panda : public Bear, public Endangered {public: Panda() { std::cout << "Panda" << std::endl; } virtual ~Panda() { std::cout << "~Panda" << std::endl; }};
测试代码
/*file:test3.cppauthor:longsy*/#include "animal.h"int main(){ ZooAnimal *animal = new Panda(); animal->shout(); //bear shout delete animal; //对于new出现的对象一定要手动地delete return 0;}
多态二义性示例代码
在上面Endangered类也添加如下代码:
class Endangered {//... virtual void shout() { std::cout <<"endangered shout" << std::endl; }};
测试代码
Panda p;p.shout(); //存在二义性
解决在多重继承下,对不同基类而同一数据多次继承的问题:使用虚继承
相关资源:破解乱码用的软件,一般情况下可用