• 【C++】继承 ⑪ ( 多继承 | 多继承语法 | 多继承案例 )






    一、多继承




    1、多继承基本语法


    多继承 概念 : 一个 子类 ( 派生类 ) 可以 继承 多个 父类 ( 派生类 ) ;

    • 一个类可以继承多个类的属性和方法 ;
    • 使用多继承 , 可以创建更复杂的类 , 该派生类可以组合多个基类的功能 ;

    只有 C++ 语言有多继承概念 , 别的语言没有该概念 ;

    • Java 语言只能继承一个父类 , 可以实现多个接口 ;

    多继承语法 :

    class 子类名称 : 访问控制关键字 父类名称1, 访问控制关键字 父类名称2, ... 访问控制关键字 父类名称n
    {
    	// 子类内容
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 访问控制关键字 :
      • public : 表示 公有继承 ;
      • protected : 表示 保护继承 ;
      • private : 表示 私有继承 ;
    • 继承的 每个 父类 都可以指定一个 访问控制关键字 ;

    2、多继承子类构造初始化


    调用多个父类构造函数 : 如果一个 子类 ( 派生类 ) 继承多个 父类 ( 基类 ) , 使用 初始化列表 调用 多个 父类 的构造函数 初始化 子类继承自父类的 成员变量 ;

    class Child : public Parent1, public Parent2 
    {
    public:
    	Child(int x, int y, int z): Parent1(x), Parent2(y)
    	{
    		this->c = z;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    多个父类构造函数调用顺序 : 多个父类 的 构造函数 的 执行顺序 , 与 定义子类时 指定的 父类顺序有关 ;


    3、多继承中访问父类成员


    子类 可能 继承多个 父类 , 父类 也有可能还有 父类 ,

    也就是说 子类 可能需要 访问 父类的成员 , 爷爷类 的成员 ,

    如果 访问 的 父类 / 爷爷类 的 成员

    • 成员变量 名称 不同 , 可以直接访问 ;
    • 成员变量 名称 相同 , 就需要使用 父类 :: 成员变量名爷爷类 :: 成员变量名 进行访问 ;




    二、多继承案例




    1、代码示例 - 简单多继承案例


    在下面的代码中 , Child 子类 继承 Parent1 和 Parent2 父类 , 可以使用 Parent1::a 访问 父类1 中的成员变量 , 使用 Parent2::b 访问 父类2 中的成员变量 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Parent1 {
    public:
    	 int a;
    };
    
    class Parent2 {
    public:
    	int b;
    };
    
    class Child : public Parent1, public Parent2 
    {
    public:
    	void print()
    	{
    		// 类内部访问父类成员
    		cout << "Parent1::a = " << Parent1::a << " , Parent2::b = " << Parent2::b << endl;
    	}
    };
    
    int main() {
    
    	Child child;
    	// 打印初始状态的值
    	child.print();
    
    	child.a = 10;
    	child.b = 20;
    	child.print();
    
    	child.Parent1::a = 30;
    	child.Parent2::b = 40;
    	child.print();
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    执行结果 :

    Parent1::a = -858993460 , Parent2::b = -858993460
    Parent1::a = 10 , Parent2::b = 20
    Parent1::a = 30 , Parent2::b = 40
    Press any key to continue . . .
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述


    2、代码示例 - 多继承构造函数案例


    多继承中 , 子类的构造函数中 , 需要在 函数初始化列表 中 调用 父类的 初始化函数 , 对 继承自 父类的 成员变量 进行初始化操作 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Parent1 {
    public:
    	Parent1(int x)
    	{
    		this->a = x;
    	}
    public:
    	 int a;
    };
    
    class Parent2 {
    public:
    	Parent2(int x)
    	{
    		this->b = x;
    	}
    public:
    	int b;
    };
    
    class Child : public Parent1, public Parent2 
    {
    public:
    	Child(int x, int y, int z): Parent1(x), Parent2(y)
    	{
    		this->c = z;
    	}
    public:
    	void print()
    	{
    		cout << "a = " << a << " , b = " << b << " , c = " << c << endl;
    	}
    public:
    	int c;
    };
    
    int main() {
    
    	Child child(1, 2, 3);
    	// 打印初始状态的值
    	child.print();
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    执行结果 :

    a = 1 , b = 2 , c = 3
    Press any key to continue . . .
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    Elasticsearch:使用字节大小的向量节省空间 - 8.6
    记录一下~~~Linux配置定时任务备份数据库dmp文件
    4.3差商、牛顿插值多项式与差分
    新能源汽车OTA升级中的UDS通信分析
    WWDC 23 之后的 SwiftUI 有哪些新功能
    【批处理DOS-CMD命令-汇总和小结】-外部命令-cmd下载命令、抓包命令(wget)
    [设计模式] 抽象工厂模式简易案例
    C语言小项目——通讯录的存储系统(静态版,动态版,文件版)
    【NLP】LLM 中 100K 上下文窗口背后的秘密:所有技巧都集中在一处
    【正点原子I.MX6U-MINI应用篇】1、编写第一个应用App程序helloworld
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134034902