• C++多重、多层、分层继承


            在本文中,您将学习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:

    1. #include
    2. using namespace std;
    3. class A
    4. {
    5. public:
    6. void display()
    7. {
    8. cout<<"基类的内容。";
    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. }

    输出结果:
    基类的内容。

    分析:

            在这个程序中,C类是从B类派生出来的(B类是从基类A派生出来的)。C类的obj对象在main()函数中定义。调用display()函数时,将执行类A中的display()。 这是因为在C类和B类中没有display()函数。编译器首先在类C中查找display()函数。由于该函数在该类中不存在,因此它将在类B中查找该函数(因为C是从B派生的)。这个display()函数在B类中也不存在,所以编译器在A类中寻找它(因为B是从A派生出来的)。如果C中存在display()函数,则编译器将覆盖类A的display()(因为成员函数覆盖)。

    C ++多重继承

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

    示例2:

    1. #include
    2. using namespace std;
    3. class Mammal {
    4. public:
    5. Mammal()
    6. {
    7. cout << "哺乳动物可以直接出生。" << endl;
    8. }
    9. };
    10. class WingedAnimal {
    11. public:
    12. WingedAnimal()
    13. {
    14. cout << "有翼的动物能拍动翅膀。" << endl;
    15. }
    16. };
    17. class Bat: public Mammal, public WingedAnimal {
    18. };
    19. int main()
    20. {
    21. Bat b1;
    22. return 0;
    23. }

    输出结果: 

    哺乳动物可以直接出生。
    有翼的动物能拍动翅膀。

    多重继承中的歧义

            多重继承最明显的问题发生在函数重写期间。假设两个基类具有相同的函数,但在派生类中未重写该函数。如果尝试使用派生类的对象调用该函数,则编译器将显示错误。这是因为编译器不知道要调用哪个函数。例如,

    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() // 错误!
    19. }

    报错位置: 

    这个问题可以通过使用范围解析函数来指定哪个函数属于base1或base2类来解决:

    1. int main()
    2. {
    3. obj.base1::someFunction( ); // 调用base1类的函数
    4. obj.base2::someFunction(); // 调用base2类的函数
    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. }

  • 相关阅读:
    Windows安装GPU版本的pytorch详细教程
    Web基础与HTTP协议
    【计算机网络】网络基础(二)
    《TCPIP网络编程》课后练习答案第一部分1~5章 尹圣雨
    Flutter——sdk:状态管理【provider】
    蓝桥杯2024年第十五届省赛真题-小球反弹
    机器学习算法(二十四):启发式算法优化机器学习算法
    HTML+CSS+JS制作一个迅雷看看电影网页设计实例 ,排版整洁,内容丰富,主题鲜明,简单的网页制作期末作业
    (C++17) optional的使用
    react-redux使用
  • 原文地址:https://blog.csdn.net/m0_48241022/article/details/133957307