1,派生类:
1,单继承的定义格式:
class 派生类名:继承方式 基类名
{派生类新定义成员; };
2,多继承的定义格式:
class 派生类名:继承方式1 基类名1,继承方式2 基类名2,…
{ 派生类新定义成员; }
3,类成员访问权限:
成员访问权限 类自身 派生类 关联类 public 可访问 可访问 可访问 protected 可访问 可访问 不可访问 private 可访问 不可访问 不可访问
2,继承方式:
基类成员访问权限 继承方式 在派生类中的访问权限 public public public protected protected private 不可访问 public protected protected protected protected private 不可访问 public private private protected private private 不可访问
3,派生类继承成员的调整:
1,恢复访问权限:当继承方式为 private 或 protected 时,可采用下述格式恢复到原来的访问权限.
基类名::成员名; //成员函数名后不要加上()
2,继承成员的重定义:
1),函数重载: 在派生类中增加了一个与基类成员函数同名的成员函数,但函数形参个数,类型或次序不同,
2),对继承函数的重定义: 在派生类中增加了一个函数原型与继承成员函数一模一样的成员函数.
3,继承成员的重命名: 在派生类中增加一个新名字命名的成员函数,该成员函数调用旧名字的函数.(解决名字冲突或选择更适合的术语来命名)
4,派生类的构造函数和析构函数:
1,构造函数格式:
派生类名::派生类名(参数表):基类名1(参数表1),...,基类名n(参数表n),子对象1(子对象参数),…,子对象m(子对象参数m)
{ 派生类新增成员的初始化语句; }
2,如果派生类的构造函数省略对基类构造函数的调用,则会调用基类默认的构造函数进行初始化.
3,构造函数执行顺序:
1),先按在派生类声明时列出的次序,从左到右调用基类的构造函数.
2),再按类声明中对象成员出现的次序调用对象成员(子对象)的构造函数.
3),最后执行派生类的构造函数.
4,析构函数调用顺序与构造函数顺序相反.
5,基类对象和派生类对象的使用关系:
1,派生类对象能作为基类对象处理.
2,向上映射转换:
dynamic_cast<类型>(表达式);
3,派生类指针强制转换为基类指针格式:
派生类对象指针=static_cast<派生类 *>(&基类对象);
6,类层次的类模板:
1,从模板类派生类模板
2,从非模板类派生类模板
3,从类模板派生非模板类
7,虚基类:
1,解决重复继承的二义性问题:
1),使用作用域分辨符来唯一标示并分别访问它们.(同一变量名相互区分,并不相连)
2),将直接基类的共同基类设置为虚基类.
2,作用域分辨符语法格式:
对象名.基类名::成员名; //数据成员
对象名.基类名::成员名(参数表); //成员函数
3,虚基类声明格式: virtual 继承方式 基类名;