1、不同的继承方式权限
1、继承方式:
- 1、public:共有继承
- 2、protected:保护继承
- 3、private:私有继承
2、不同继承方式的规律:
- 1、不同的继承方式不会影响子类对父类的访问权限
- 2、不同的继承方式,只会影响到内外的访问权限(内外只能访问:基类中的《共有继承》的《共有成员》)
- 3、子类会继承父类的非私有成员,但并不会直接继承私有成员。
继承方式总结:
- 1、假设用户向访问基类的共有成员,就采用《共有继承》
- 2、假设在多级继承中想要子类的子类去访问,基类的保护成员或者共有成员,就使用《保护继承》
- 3、假设在多级继承中,不想子类的子类访问基类的数据成员,则使用《私有继承》
在日常开发中,一般都采用公有继承,因为访问权限最高!!!
2、类中的隐藏问题
隐藏:
- 1、在继承中,如果子类与父类出现同名函数,则子类会把父类的功能函数给隐藏掉
- 2、假设想在子类中使用父类的被隐藏的接口,使用域操作符指定父类的接口
a.base::show();
- 3、派生类中,只要编写了一个与父类同名的函数,就会把父类的方法给隐藏(不支持重载)
- 4、通过父类引用派生类,也可以调用父类的方法
#include <iostream>
using namespace std;
class base
{
public:
void show()
{
cout << "show base" << endl;
}
};
class new_base : public base
{
public:
void show()
{
cout << "show new_base" << endl;
}
};
int main()
{
new_base a;
//调用父类的 show 方法 ,无效的调用。因为父类的方法已经被隐藏了
a.show();
//利用域操作符 ,声明是用父类的方法
a.base::show();
}
3、类中的多继承
一个派生类可以继承多个基类,获取多个基类的功能接口和数据成员,提高代码的复用性。
语法:
class 派生类 : 继承方式 基类1, 继承方式 基类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;
}
};
4、类中多级继承
语法:
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了就直接使用不再分配。