二十一、继承(Inheritance)
注释:inheritance - - - - - - n.继承/ in’heritәns /
1、继承概念
通过一种机制表达类型之间的共性和特性的方式,利用已有的数据类型定义新的数据类型,这种机制称为继承;
eg:
人类:姓名、年龄、吃饭、睡觉
学生类:姓名、年龄、吃饭、睡觉、学号、学习
教师类:姓名、年龄、吃饭、睡觉、工资、授课
人类:姓名、年龄、吃饭、睡觉(基类/父类)
学生类继承人类:学号、学习(派生类/子类)
教师类继承人类:工资、授课
2、基本语法
class 子类:继承方式1 基类1,继承方式2 基类2..{
...
};
继承方式:
a. 公有继承:public
b. 私有继承:private
c. 保护继承:protected
eg:
class Human{...}
class Student:public Human{
// Student类继承了Human类
// 在Student类中,存在一份Human类中的成员
};
3、公有继承的特性(public)
1)子类对象可以当做基类对象来使用
子类对象会继承基类属性和行为,通过子类对象可以访问基类中的成员,如同是基类对象在访问它们;
子类对象中包含基类的部分称为:“基类子对象”;
2)向上造型(重点)
将子类类型的指针或引用转换为基类类型的指针或引用;这种操作性缩小的类型转换,在编译器看来是安全的,所以可以隐式完成转换。
3)向下造型
将基类类型的指针或引用转换为子类类型的指针或引用;这种操作性放大的类型转换,在编译器看来是危险的,因此必须显示转换。
4)子类继承基类的成员
a. 子类可以直接访问基类中的公有成员和保护成员,就如同它们是子类自己的成员一样;
b. 基类的私有成员在子类中虽然存在但是不可见,因此无法直接访问,但是可以通过基类提供公有的或保护的接口函数来间接访问;
c. 子类无法继承基类的构造函数和析构函数,但是子类可以在构造函数的初始化表中指明基类部分的初始化方式;
class 子类: public 基类{
子类(..):基类(..){}
};
5)子类隐藏基类中成员
a. 子类和基类中定义同名的成员函数,因为作用域不同,不会构成关系,而是一种隐藏关系;
b. 如果需要子类中访问所隐藏的基类成员函数,可以通过作用域限定方式,显示的指明;
4、继承方式和访问控制属性
1)三种访问控制属性:影响访问该成员的位置
访问控制限定符 | 访问控制属性 | 内部访问 | 子类访问 | 外部访问 | 友元访问 |
public | 公有成员 | ok | ok | ok | ok |
protected | 保护成员 | ok | ok | no | ok |
private | 私有成员 | ok | no | no | ok |
2)三种继承方式:影响通过子类访问基类中的成员的可访问性
基类中 | 公有子类中 | 保护子类中 | 私有子类中 |
公有成员 | 公有成员 | 保护成员 | 私有成员 |
保护成员 | 保护成员 | 保护成员 | 私有成员 |
私有成员 | 私有成员 | 私有成员 | 私有成员 |