继承基础概念:
人有名字和年龄,同时也能吃饭,工人也有,工人还能工作。
其中Worker是派生类,CommonPerson是基类。
继承方式:
- 公有继承:class A:public B
- 保护继承:class A:protected B
- 私有继承:class A:private B
公有继承:
基类成员访问属性 | 继承方式 | 派生类成员访问属性 |
private成员 | public | 无法访问 |
protected成员 | public | protected |
public成员 | public | public |
保护继承:
基类成员访问属性 | 继承方式 | 派生类成员访问属性 |
private成员 | protected | 无法访问 |
protected成员 | protected | protected |
public成员 | protected | protected |
私有继承:
基类成员访问属性 | 继承方式 | 派生类成员访问属性 |
private成员 | private | 无法访问 |
protected成员 | private | private |
public成员 | private | private |
B类从A类派生,那么B类是A类的子类,A类是B类的超类。
B类从A类派生,那么B类中包含有A类的所有数据成员。
B类从A类的公共诞生,只能调用到A的公共及保护限定符下的成员函数。
B类从A类的公共诞生,可以在B类中直接使用A的公共及保护限定符下的数据成员。
B类从A类公共派生,那么A类的私有成员函数不能被B类继承使用。
B类从A类公共诞生,那么A类的公共成员函数成为B类的公共成员函数。
B类从A类公共诞生,那么A类的保护成员函数成为B类的保护成员函数。
B类从A类公共诞生,那么A类的私有成员函数不能被B类继承并使用。
B类从A类私有派生,那么A类的公共成员函数成为B类的私有成员函数。
B类从A类保护派生,那么A类的公共成员函数成为B类的保护成员函数。
B类从A类保护派生,那么A类的保护成员函数成为B类的保护成员函数。
隐藏:【覆盖和隐藏易混淆】
此时子类的ABC函数隐藏A类的ABC函数。当实例化B对象,使用该对象只能够直接的访问到子类B当中的成员函数ABC而无法访问到A类中的成员函数ABC,因此父类的ABC似乎就被隐藏起来了。【同名的数据成员也有隐藏特性】
需要满足的前提:父子关系、成员同名、隐藏
多继承、多重继承:
多重继承:
多继承:(java是单继承)
多继承是指一个子类继承多个父类。
B继承A、C继承A,并不是多继承。即当一个父类有多个子类时,此时不是多继承。
多继承对父类的个数没有限制,继承方式可以是公有继承、保护继承、私有继承。
多重继承和多继承不同, 当B类从A类派生,C类从B类派生,此时可以成为多继承。
题外话:
Flutter中常常会遇到这种多继承结构,需要顶层下发数据而绕过不必要的层级,因为中间层有些是不需要传递数据的,因此有了状态管理的概念。
虚继承:
在菱形继承中,
既有多继承又有多重继承,当我们要实例化D的时候发现D中会含有2个完全一样的A的数据。
冗余数据不能容忍。
虚继承是继承的一种方式。
关键字virtual
class B: virtual public A
class C: virtual public A
clas C: public B, public C