派生相关
在派生中,需要注意以下几件事:
1. 不同的继承方式使得派生类对基类中的成员访问属性不同。一般可以总结如下:
公有继承:不能直接访问基类中的私有成员,但能间接访问。能访问保护和公有成员。
保护继承:不能直接访问私有继承,能访问保护和公有成员。
私有继承:私有成员不可直接访问,公有和保护成员可访问。
可总结为:
基类中的成员 | 在公有派生类中的访问属性 | 在私有派生类中的访问属性 | 在保护派生类中的访问属性 |
私有成员 | 不可直接访问 | 不可直接访问 | 不可直接访问 |
公有成员 | 公有 | 私有 | 保护 |
保护成员 | 保护 | 私有 | 保护 |
2. 在派生类的实例化时,其构造函数和析构函数调用顺序:先调用基类的构造函数,再调用派生类的构造函数;在调用析构函数时,先调用派生类的析构函数,再调用基类的析构函数。
总的来说,可以总结如下:
顺序:
调用基类的构造函数,对基类的数据成员进行初始化;
调用内嵌对象成员的构造函数,对内嵌对象成员进行初始化;
执行派生类的构造函数体,对派生类数据成员初始化。
而在撤销对象时,析构函数的调用顺序刚好与构造函数的调用顺序相反。
值得注意的是,当有多个基础类时,我们初始化派生类对象调用基类构造函数的顺序是按在继承是的声明顺序调用的。
3. 虚基类
虚基类的引入:如果两个派生类拥有同一个基类,派生类作为基类时,它的派生类在初始化各自对象时,就会有两个基类对应的空间,即产生了基类两个复制。为了让基类只产生一个复制,引入了虚基类。
声明虚基类:class 派生类名:virtual 继承方式基类名{//…} 这样的类作为基类时,就会只产生一个复制。
虚基类的初始化:由最远派生类的构造函数通过调用虚基类的的构造函数进行初始化,而该派生类的其他成员对虚基类的调用都自动忽略。但是只有当基类是虚基类再派生类中才能这样调用,否则会出现错误。
虚基类的使用大都需要使用指针:即声明为基类对象的指针可以指向它的共有派生类对象,但不能指向它的私有派生类对象。但不允许将声明为指向公有派生类对象的指针指向基类的一个对象。这称为赋值兼容。