携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
1 多继承简述
C++语言支持多继承,一个子类可以有多个父类,子类拥有所有父类的成员变量,子类继承所有父类的[成员函数]
语法规则:
class 子类 :继承方式 父类1 , 继承方式 父类2...
多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。以上面的 A、B、C、D 类为例,D 类构造函数的写法为:
D(形参列表): A(实参列表), B(实参列表), C(实参列表){
//其他操作
}
基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。仍然以上面的 A、B、C、D 类为例,即使将 D 类构造函数写作下面的形式:
D(形参列表): B(实参列表), C(实参列表), A(实参列表){
//其他操作
}
那么也是先调用 A 类的构造函数,再调用 B 类构造函数,最后调用 C 类构造函数。
2 多继承举例说明
#include<iostream>
using namespace std;
class Fat1
{
public:
Fat1() {
a = 1;
}
int a;
};
class Fat2
{
public:
Fat2() {
b = 1;
}
int b;
};
//私有继承
class Son :public Fat1,public Fat2
{
public:
int c = 3;
int d = 4;
};
void test()
{
Son s;
cout << "a = " << s.a << " b = " << s.b << " c = " << s.c << " d = " << s.d << endl;
cout << "size of s = " << sizeof(s) << endl;
}
int main() {
test();
system("pause");
return 0;
}
输出: a = 1 b = 1 c = 3 d = 4 size of s = 16 请按任意键继续. . .
3 多继承可能会引发父类中有同名成员出现,需要加作用域区分
class Fat1
{
public:
Fat1() {
a = 1;
}
int a;
};
class Fat2
{
public:
Fat2() {
a = 1;
}
int a;
};
报错显示:
class Fat1
{
public:
Fat1() {
a = 1;
}
int a;
};
class Fat2
{
public:
Fat2() {
a = 1;
}
int a;
};
//私有继承
class Son :public Fat1,public Fat2
{
public:
int c = 3;
int d = 4;
};
void test()
{
Son s;
cout << "Fat1::a = " << s.Fat1::a << " Fat2::a = " << s.Fat2::a << " c = " << s.c << " d = " << s.d << endl;
cout << "size of s = " << sizeof(s) << endl;
}
输出:
Fat1::a = 1 Fat2::a = 1 c = 3 d = 4 size of s = 16 请按任意键继续. . .
结论:
多继承容易产生成员同名的情况 通过使用类名作用域可以区分调用哪一个基类的成员