类的继承
- 共性与特性
- 表达不同类型事物之间共有的属性与行为
- 个性用于刻画每种事物特有的属性和行为
- 共性表示为父类(基类),个性表示为子类(派生类)
- 子类继承自父类
- 基类派生出子类
继承的基本语法
- 继承表
- 一个子类可以同时继承0到多个父类,每个父类的继承方式可以相同也可以不同
class 子类:继承方式1 父类1,继承方式2 父类2,...{}
- 一个子类可以同时继承0到多个父类,每个父类的继承方式可以相同也可以不同
- 继承方式
public
共有继承:父类的特性可以通过子类向外扩展private
私有继承:父类的特性只能为子类所有protected
保护继承:父类的特性只能在继承链内扩展
继承的基本特点
- 公共特点(所有继承都有的特点)
- 子类对象可以当作父类对象来使用,子类对象与父类对象没有本质上的区别
- 子类的逻辑空间小于父类,但它的物理空间大于等于父类
- 子类对象 IS A 父类对象
- 向上和向下转换(造型)
- 从子类到父类:子类的指针可以隐式转换成父类的指针或引用,这是一种缩小类型的转换,对于编译器来说是安全的(父类指针指向子类对象是安全的)
Father a = new son;
- 从父类到子类:父类的指针或引用不可以转换成子类的指针或引用,这是一种扩大型的转换,在编译器来看是危险的(子类的指针指向父类的对象是不安全的)
- 编译器仅仅是检查指针或引用的数据,而对实际引用的目标对象不关心(构成多态的基础)
- 类型一致:父类的指针或引用实际的目标类型是否需要转换成实际的指针或引用由程序员自己决定
- 从子类到父类:子类的指针可以隐式转换成父类的指针或引用,这是一种缩小类型的转换,对于编译器来说是安全的(父类指针指向子类对象是安全的)
- 子类会继承父类的所有成员,(公开,私有,保护)
- 子类会隐藏父类的同名成员
- 可以通过域限定符
父类::隐藏成员
进行访问父类中的隐藏成员 - 可以使用指针的指针或引用来指向子类对象,然后访问父类中的隐藏成员
- 可以通过域限定符
- 虽然子类继承了所有父类中的成员,但不能访问父类中的私有成员
继承方式影响访问控制
父类成员在不同作用域的访问权限
父类成员 | 内部 | 子类 | 外部 | 友元 | 子类对象(public继承) | 子类对象(protected继承) | 子类对象(private继承) |
---|---|---|---|---|---|---|---|
public | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
protected | ✔ | ✔ | ✘ | ✔ | ✘ | ✘ | ✘ |
private | ✔ | ✘ | ✘ | ✔ | ✘ | ✘ | ✘ |
继承的访问控制
父类成员 | 公有继承的子类 | 保护继承的子类 | 私有继承的子类 |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | 不可直接访问 | 不可直接访问 | 不可直接访问 |