• 【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

    在这里插入图片描述

  • 相关阅读:
    隐藏表头和最高层级的复选框
    浅谈Vue中 ref、reactive、toRef、toRefs、$refs 的用法
    设计模式 23 访问者模式
    类和对象10:对象访问方法
    LeetCode 11. 盛最多水的容器
    干货 | Elasticsearch 8.X 实战视频合集(80 小时+)
    如何建立企业数字化营销体系?使用数字化营销系统助企业升级?
    Linus 没空实现的功能,开发者做到了:苹果 M1 Mac 成功运行原生 Linux!
    Spring Cloud【分组消费、为什么需要链路追踪 、Spring Cloud Sleuth是什么、微服务集成Sleuth实现链路打标】(十二)
    剑指offer 16 数值的整数次方
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134034902