多继承
一个派生类可以继承多个基类, 获取多个基类的功能接口和数据成员,提高代码的复用性。
语法:
class 派生类 :继承方式 基类 ,继承方式 基类2 ........
{
}
例子:
class base : public base1 ,public base2
构造函数的执行顺序: base1 -> base2 -> base
析构函数的执行顺序: base -> base2 -> base1
//提示: 哪一个先继承,那么就先执行他的构造 ,从左 -》 右
多继承的参数列表初始化:
class base_a
{
public:
base_a(int a):a(a){}
int a;
};
class base_b
{
public:
base_b(int b):b(b){}
int b;
};
class base_all:public base_a ,public base_b
{
public:
base_all(int a,int b,int c):base_a(a),base_b(b),c(c){}
int c;
void show()
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
};
多级继承
语法:
class 基类名
class 派生类 :继承方式 基类名
class 派派生类 : 继承方式 派生类
例子:
class base
class base_a :public base
class base_b :public base_a
构造函数的执行顺序: base -> base_a -> base_b
析构函数的执行顺序: base_b -> base_a -> base
多级继承的参数列表初始化
两种继承方式的框架图:
菱形继承
菱形继承会出现一个二义性问题,导致派生类无法调用,基类的所有功能函数!!
菱形继承的二义性解决方式
1.利用 域操作符,指定使用哪一个基类中的函数方法
a.base_a::show();
a.base_b::show();
2.利用 基类引用派生类,再调用出现二义性的方法
base_a &q=a;
base_b &q=a;
3.在派生类中重写出现二义性的方法,把之前的隐藏掉。
4.最强的处理方法: 利用虚继承,让base 的空间存放在虚表中,不构造两次!!
base:
base_a :virtual public base //-> base_a 虚继承base -》 系统就会把 base 放到虚表中
base_b :virtual public base //->base_b 虚继承base -> base_b 发现虚表已经存在base了就直接使用不再分配。