原文: https://www.programiz.com/cpp-programming/multilevel-multiple-inheritance
在本文中,您将学习 C++ 编程中的不同继承模型:带有示例的多继承,多层和分层继承。
继承是面向对象编程语言的核心功能之一。 它允许软件开发人员从现有的类派生一个新的类。 派生类继承基类(现有类)的功能。
C++ 编程中有多种继承模型。
C++ 多层继承
在 C++ 编程中,不仅可以从基类派生一个类,还可以从派生类派生一个类。 这种继承形式称为多级继承。
class A{... .. ...};class B: public A{... .. ...};class C: public B{... ... ...};
这里,类别B从基础类别A派生,类别C从派生类别B派生。
示例 1:C++ 多级继承
#include <iostream>using namespace std;class A{public:void display(){cout<<"Base class content.";}};class B : public A{};class C : public B{};int main(){C obj;obj.display();return 0;}
输出
Base class content.
在此程序中,类别C源自类别B(源自基础类别A)。
在main()函数中定义了C类的obj对象。
当调用display()函数时,将执行A中的display()。 这是因为在C类和B类中没有display()函数。
编译器首先在类C中寻找display()函数。 由于该函数不存在,因此将在B类中查找该函数(因为C源自B)。
该函数在B类中也不存在,因此编译器在A类中查找它(因为B是从A派生的)。
如果C中存在display()函数,则编译器将覆盖类A的display()(因为成员函数将覆盖)。
C++ 多重继承
在 C++ 编程中,一个类可以从多个父类派生。 例如:类Bat源自基类Mammal和WingedAnimal。 这很有意义,因为蝙蝠既是哺乳动物又是有翅膀的动物。

示例 2:C++ 编程中的多重继承
#include <iostream>using namespace std;class Mammal {public:Mammal(){cout << "Mammals can give direct birth." << endl;}};class WingedAnimal {public:WingedAnimal(){cout << "Winged animal can flap." << endl;}};class Bat: public Mammal, public WingedAnimal {};int main(){Bat b1;return 0;}
输出
Mammals can give direct birth.Winged animal can flap.
多重继承中的歧义
多重继承最明显的问题发生在函数覆盖期间。
假设两个基类具有相同的函数,但在派生类中未覆盖该函数。
如果尝试使用派生类的对象调用该函数,则编译器将显示错误。 这是因为编译器不知道要调用哪个函数。 例如,
class base1{public:void someFunction( ){ .... ... .... }};class base2{void someFunction( ){ .... ... .... }};class derived : public base1, public base2{};int main(){derived obj;obj.someFunction() // Error!}
可以通过使用范围解析函数指定将base1或base2分类的函数来解决此问题。
int main(){obj.base1::someFunction( ); // Function of base1 class is calledobj.base2::someFunction(); // Function of base2 class is called.}
C++ 分层继承
如果从基类继承多个类,则称为分层继承。 在分层继承中,子类中共有的所有函数都包括在基类中。
例如:物理,化学,生物学均来自科学类。
分层继承的语法
class base_class {... .. ...}class first_derived_class: public base_class {... .. ...}class second_derived_class: public base_class {... .. ...}class third_derived_class: public base_class {... .. ...}
