★继承
※就是在一个已存在的类的基础上建立一 个新的类。
※已存在的类成为基类或父类。
※新建立的类称为派生类或子类。
★派生类的特点
Ø 继承了基类的所有数据成员和成员函数。
Ø增加了新的成员(数据成员或成员函数)。
Ø重新定义了已有的成员函数。
Ø改变基类成员的访问权限。
※用公有继承方式建立的派生类称为公有派生类,其基类称为公有基类。
公有基类 | 在公有派生类中的访问属性 |
私有成员 | 不可访问 |
公有成员 | 公有 |
保护成员 | 保护 |
※用私有继承方式建立的派生类称为私有派生类,其基类称为私有基类。
私有基类 | 在私有派生类中的访问属性 |
私有成员 | 不可访问 |
公有成员 | 私有 |
保护成员 | 私有 |
※受保护的成员不能被类外访问
※保护成员可以被派生类的成员函数引用
基类成员 | 在保护派生类中的访问属性 |
私有成员 | 不可访问 |
公有成员 | 保护 |
保护成员 | 保护 |
★(1)派生类构造函数必须负责该派生类所有基类构造函数的调用;
(2)派生类构造函数的执行顺序是先执行基类的构造函数,再执行派生类本身构造函数。
(3)处于同一层次的各基类构造函数的执行顺序取决于定义派生类所指定的各基类顺序。
(4)与派生类构造函数中定义的成员初始化列表的各项顺序无关。
派生类的构造函数和析构函数
1、构造函数
Ø 构造函数不能够被继承
Ø 派生类的构造函数必须通过调用基类的构造函数来初始化基类的子对象。
Ø 在定义派生类构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基
类构造函数使基类的数据成员得以初始化。
★派生类构造函数的一般格式:
派生类构造函数名(参数列表):基类构造函数(参数列表)
{
派生类中数据成员初始化;
}
★派生类构造函数的调用顺序如下
Ø 基类的构造函数
Ø 子对象的构造函数(如果有的话)
Ø 派生类构造函数
赋值兼容
ü 派生的对象可以赋给基类对象;
deriver d;
base b;
b=d;
ü 派生类的对象可以初始化基类的引用;
deriver d;
base &br=d;
ü 派生类的对象的地址可以赋给指向基类的指针。
derived d;
base *pb=&d;
虚基类
※如果在多条继承路径上有一个公共的基类,那么在这些路径中的某几条路径的汇总处,
这个公共的基类就会产生多个实例。
※如果想使这个公共的基类只产生一个实例,则可以将这个基类说明为虚基类。
※这要求从base类派生新类时,使用关键字virtual将base类说明为虚基类。
虚基类的声明方法
(1) 使用关键在virtual
(2) 基本格式如下: class 派生类名:virtual 继承特性 基类名
{
派生类新增成员;
}
(3) 虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。
(4)如果虚基类中定义了带参数的构造函数,而且没有定义默认的构造函数,则在其所有派生类中,通过构造函数的初始化表对虚基类进行定义。
(5)C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类(如类B和类C)对虚基类的构造函数的调用。