C++多重继承

xiaoxiao2024-04-21  36

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(); //存在二义性 解决在多重继承下,对不同基类而同一数据多次继承的问题:使用虚继承 相关资源:破解乱码用的软件,一般情况下可用
转载请注明原文地址: https://www.6miu.com/read-5015133.html

最新回复(0)