1. 继承的概念及重要性
inheritance :是软件重用的一种形式,将相关的类组织起来,并分亨其间的共通数据和操作行为。
最具吸引力的特点:新类可以从现有的类库中继承。提倡建立与现有的类有许多共性的新类来实现软件的重用
能添加基类的所没有的特点以及取代和改进从基类继承来的特点
单重继承形成树状层次结构,由基类和派生类构成了一种层次关系,继承的层次在系统的限制范围内是任意的。
继承机制定义了父子关系
2.基类
*父类定义了所有子类共通的对外接口和私有实现内容,父类被称为基类
* 成员函数:
基类的私有成员只能被基类的成员函数和友元访问
基类的受保护成员只能被基类及派生类的成员函数和友元访问
* 继承基类的方式
public公有继承使用最多,公对公,受保护受保护,私不用
protected:公、保护对保护, private :公、保护对私
3.派生类
*新类继承预定义基类的数据成员和成员函数,而不必重新编写数据成员和成员函数,这种新类叫派生(derived)类
* 派生类永远不能直接访问基灶的私有成员
* 重定义函数
派生类中无需继承的功能及要扩充的基类功能可以重定义成员函数,但在派生类再调用基类的同名函数时要用到作用域运算符Employee::print()
* 派生类的构造函数和析构函数
由于派生类继承了基类的成员,所以在建立派生类的实例对象时,必须调用基类的构造函数来初始化派生类对象中的基类成员。可隐式的调用基类构造函数,也可在派生类的构造函数中通过给基类提供初始化值(成员初始化值列表)明确的调用构造函数
构造函数调用顺序,先执行基类的构造函数->派生类的成员对象构造函数 ->派生类构造函数
析构函数调用顺序正好相反。
++++++++++ 切记:派生类不继承基类的构造函数、析构函数和赋值运算符,但派生类的构造函数和赋值运算符能调用基类的构造函数和赋值运算符
4.基类 VS 派生类
理解要点:可把基类和派生类都看成是一种类型如int
* 对象
派生类的对象可作为基类的对象处理,也即定义的派生类对象Time t 可以访问基类的成员函数和受保护数据,派生类对象赋给基类对象也是合理的。反之则不行,基类的对象不能自动的成为派生类的对象,因为派生类有扩充基类的对象中有些没有了
* 指针
派生类对象的指针可以隐式的转换为基类的指针。也即派生类指针可直接赋给基类指针,反之则不行
但可以用显式类型转换把基类指针强制转换为派生类指针,如要复引用该指针,要在转换前首先应该把它指向某个派生类对象(因不能引用该对象中并不存在的派生类对象) 如char * c;(int *) c;
* 两者关系
直接用基类指针引用基类对象:time * t,c; * t= &c; * t 返回对象c的引用 t ->(成员)
直接用派生类指针引用派生类对象
用基类指针引用一个派生类对象,但只能引用基类成员(在多态中很有用)
time * t, time2 c; * t = &c; * t 返回派生类的对象的引用, t ->(基类成员)
用派生类指针引用基类对象,绝对不行。必须先强制转换为基类指针
time t, time2 * c; * c = &t, * c及 c->(成员)错误
time t, time2 * c; * c = (time *)c c-> (成员)正确
指针操作是利用箭头成员选择运算符来访问成员的。
无论怎样赋值,对象的引用一定要本对象有这个数据或成员函数--Skyala
5. 多重继承
* 一个类可从多个基类派生而来,这种派生叫多重继承。是一种图状层次结构(有向无环图)。注:功能强大,但易引起二义性,使用双目作用域为解决之一法
* 用法:一个类型A,是类型B,也是类型C
* 冒号后(:)加公有基类列表 class t:public d,public c {}