在实际中,一个派生类可以派生出两个或者多个基类,派生类从两个或者多个基类中继承所需要的属性,在这种情况下,C++允许一个派生类同时继承多个基类。这称为多重继承。
多重继承的声明方法:
class D:public A,private:B,protected C
{
类D新增的成员
}
D是多重继承的派生类,它以公有继承的方式继承A类,以私有继承的方式继承B类,以保护继承的方式继承C类。按照不同的方式继承A,B,C属性,确定各基类的成员在派生中的访问权限。
多重派生的构造函数
派生类构造函数名(总参数列表)基类1构造函数(参数列表),基类2构造函数(参数列表),基类2构造函数(参数列表),基类3构造函数(参数列表)
{
派生类中新增成员数据初始化语句
}
多重继承会继承引起二义性问题
(1)两个基类中有同名的成员
class A
{
public:
int a;
void display();
};
classB
{
public:
int a;
void display();
};
class C:public A, public B
{
public:
int b;
void show();
};
在main函数中定义了C类对象C1:
C C1;
C1.a=3;
C1.display();
由于基类中A和B中都有成员 a 和成员函数 display,编译系统无法判别要访问的哪一个基类成员。可以用基类名限定:
C1.A::a =3;
C1.A:display();
(2)两个基类和派生类中都有同名成员,修改C类:
class C:public A, public B
{
public:
int a;
void display();
};
同样的,在main中如下定义:
C C1;
C1.a=3;
C1.display();
则系统访问的是派生C中成员。
规则是:基类中的派生类成员被覆盖,屏蔽,或者说是不可见的,或者说是:派生类中的同名成员覆盖了基类的同名函数。
(3)类A和B是从同一个基类派生的。
class N
{
public:
int a;
void display();
};
class A:public N
{
int a1;
};
class B:public N
{
int a2;
};
class C:public A,public B
{
public:
int a3;
void show();
};
int main()
{
C c1;
}
从程序中,我们可以得到C类中的数据成员和成员函数:
数据成员:
int A::a;
int A::a1;
int B::a;
int B::a2;
int a3;
成员函数:
void A::display();
void B:display();
void show();
如果要访问类N的派生类A的基类成员
c1.A::a=3;
c1.A::display();