继承是软件复用的一种形式,他是在现有类的基础上建立新类,新类继承了现有类的属性和方法,并且还拥有了其特有的属性和方法,继承的过程称为派生,新建的类称为派生类(子类),原有的成为基类(父类)
单一继承,继承自一个父类
多个继承,继承自多个父类
不允许继承循环
不允许继承私有成员
继承的声明
派生方式关键词 private、public和protected,规定了派生类成员和类外对象访问基类的权限
如果没有写继承方式,默认为private
派生类的生成过程:吸收基类成员(除去私有、构造函数、析构函数)、改造基类成员(同名覆盖)、添加新成员
公有继承:
public,成员访问权限不变,基类的private成员不可被派生访问,只能通过基类的公有和保护成员函数间接访问,基类的protected成员可以直接被派生类访问,但派生类外只能通过派生类的共有或保护成员函数、基类的成员函数访问
私有继承:
基类的公有成员和保护成员,都将以私有被派生类继承,私有在基类中不可直接访问,必须通过基类的公有函数访问,基类的保护和公有只能在派生类内使用
保护继承:
基类的保护和公有成员在派生类中都讲作为保护成员,只能被派生类的成员函数和友元函数访问,基类的私有成员,只能派生类中通过基类的公有和保护成员间接访问
派生类的构造函数与析构函数:
派生类构造函数执行如下:
按照基类的声明顺序调用基类的构造函数,与派生类的初始化列表顺序无关
按照派生类的成员声明顺序,初始化新增成员对象
执行派生类的构造函数题中的内容
派生类的析构顺序:
首先调用派生类的析构函数(清理派生类的新增成员)
如果派生类有成员对象,调用派生类成员对象所在类的析构函数
在调用普通基类的构造函数
最后调用虚基类的构造函数
多继承的二义性问题:
成员限定符解决:对象.父类::变量
成员重定义:在派生类中新增与基类名称相同的成员
虚基类virtual 要虚化的基类的名字
虚基类的性质:
虚基类使得公共基类得派生中只有一个拷贝,改变基类得变量所有子类得到得变量值也改变
虚基类得派生类必须初始化列表给出初始化,若为列出会调用缺省构造函数,所以虚基类必须要有缺省构造函数.
虚基类得初始化是有最远派生类调用其构造函数,若未给出就调用虚基类的缺省构造
若虚基类没有缺省构造,哪每一个派生类得初始化列表都必须对虚基类进行初始化调用
虚基类注意点:
初始化列表中同时出现虚基类和非基类得构造函数调用,虚基类得构造函数优先于非虚基类
虚基类比普通类的运行效率要低
虚基类的最远派生类对其进行初始化
派生类得对象可以赋值给基类得对象
派生类对象可以初始化基类得引用
派生类得对象地址可以赋值给基类得指针
赋值后,派生类对象就可以作为基类的对象使用,但只能使用基类继承的成员
若基是虚函数 则会被重写为派生类的成员