一、多继承
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 . . .