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

2023-10-26 16:30:29 浏览数 (1)

一、多继承

1、多继承基本语法

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

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

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

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

多继承语法 :

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

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

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

代码语言:javascript复制
class Child : public Parent1, public Parent2 
{
public:
	Child(int x, int y, int z): Parent1(x), Parent2(y)
	{
		this->c = z;
	}
}

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

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

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

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

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

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

二、多继承案例


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

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

代码示例 :

代码语言:javascript复制
#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;
}

执行结果 :

代码语言:javascript复制
Parent1::a = -858993460 , Parent2::b = -858993460
Parent1::a = 10 , Parent2::b = 20
Parent1::a = 30 , Parent2::b = 40
Press any key to continue . . .

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

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

代码示例 :

代码语言:javascript复制
#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;
}

执行结果 :

代码语言:javascript复制
a = 1 , b = 2 , c = 3
Press any key to continue . . .

0 人点赞