原文: https://www.programiz.com/cpp-programming/multilevel-multiple-inheritance

在本文中,您将学习 C++ 编程中的不同继承模型:带有示例的多继承,多层和分层继承。

继承是面向对象编程语言的核心功能之一。 它允许软件开发人员从现有的类派生一个新的类。 派生类继承基类(现有类)的功能。

C++ 编程中有多种继承模型。


C++ 多层继承

在 C++ 编程中,不仅可以从基类派生一个类,还可以从派生类派生一个类。 这种继承形式称为多级继承。

  1. class A
  2. {
  3. ... .. ...
  4. };
  5. class B: public A
  6. {
  7. ... .. ...
  8. };
  9. class C: public B
  10. {
  11. ... ... ...
  12. };

这里,类别B从基础类别A派生,类别C从派生类别B派生。


示例 1:C++ 多级继承

  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. void display()
  7. {
  8. cout<<"Base class content.";
  9. }
  10. };
  11. class B : public A
  12. {
  13. };
  14. class C : public B
  15. {
  16. };
  17. int main()
  18. {
  19. C obj;
  20. obj.display();
  21. return 0;
  22. }

输出

  1. 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()函数,则编译器将覆盖类Adisplay()(因为成员函数将覆盖)。


C++ 多重继承

在 C++ 编程中,一个类可以从多个父类派生。 例如:类Bat源自基类MammalWingedAnimal。 这很有意义,因为蝙蝠既是哺乳动物又是有翅膀的动物。

C   多重,多层和分层继承 - 图1

示例 2:C++ 编程中的多重继承

  1. #include <iostream>
  2. using namespace std;
  3. class Mammal {
  4. public:
  5. Mammal()
  6. {
  7. cout << "Mammals can give direct birth." << endl;
  8. }
  9. };
  10. class WingedAnimal {
  11. public:
  12. WingedAnimal()
  13. {
  14. cout << "Winged animal can flap." << endl;
  15. }
  16. };
  17. class Bat: public Mammal, public WingedAnimal {
  18. };
  19. int main()
  20. {
  21. Bat b1;
  22. return 0;
  23. }

输出

  1. Mammals can give direct birth.
  2. Winged animal can flap.

多重继承中的歧义

多重继承最明显的问题发生在函数覆盖期间。

假设两个基类具有相同的函数,但在派生类中未覆盖该函数。

如果尝试使用派生类的对象调用该函数,则编译器将显示错误。 这是因为编译器不知道要调用哪个函数。 例如,

  1. class base1
  2. {
  3. public:
  4. void someFunction( )
  5. { .... ... .... }
  6. };
  7. class base2
  8. {
  9. void someFunction( )
  10. { .... ... .... }
  11. };
  12. class derived : public base1, public base2
  13. {
  14. };
  15. int main()
  16. {
  17. derived obj;
  18. obj.someFunction() // Error!
  19. }

可以通过使用范围解析函数指定将base1base2分类的函数来解决此问题。

  1. int main()
  2. {
  3. obj.base1::someFunction( ); // Function of base1 class is called
  4. obj.base2::someFunction(); // Function of base2 class is called.
  5. }

C++ 分层继承

如果从基类继承多个类,则称为分层继承。 在分层继承中,子类中共有的所有函数都包括在基类中。

例如:物理,化学,生物学均来自科学类。


分层继承的语法

  1. class base_class {
  2. ... .. ...
  3. }
  4. class first_derived_class: public base_class {
  5. ... .. ...
  6. }
  7. class second_derived_class: public base_class {
  8. ... .. ...
  9. }
  10. class third_derived_class: public base_class {
  11. ... .. ...
  12. }