继承:
基类(父类)
派生类(子类)
派生类是基类的具体化
用法:class 派生类名 :基类名
继承的三种方法:公有 私有 保护
默认继承:
struct D1:Base{}; //公有继承(结构体也可以继承)
class D2:Base{}; //私有继承
派生类无法访问基类的构造函数
派生类中的所有的构造方法都需要调用基类的构造方法
先调用基类的构造函数,再调用派生类的构造函数
先释放派生类的构造函数,再释放基类的构造函数
构造函数:基类的子对象->基类->派生类的子对象->派生类
析构函数:与上面相反
不能被继承:①构造函数 ②析构函数 ③=运算符 ④友元关系 静态成员无所谓继承
接口继承与实现继承:
接口继承在基类中实现,派生类中不实现
实现继承在基类中实现但private,派生类中重新实现
基类、派生类的转换:
向上转型 派生类到基类√
向下转型 基类到派生类×
单纯继承无异议 多态中有意义
public类型编译器自动转化
private\protected类型 需要强制类型转化------>pb = reinterpret_cast<Base *>(pd);
二义性☆
多继承不能用虚继承
作用域限定符解决了多继承和多重继承的二义性
虚继承解决多重继承的二义性
使用虚继承 编译器默认生成虚基类表指针 vbptr 指向虚基类表(数组) 保存数组的地址
vbptr 1、本类地址与虚基类表指针地址的差 B1和vbptr 0
2、虚基类地址与虚基类表指针在地址的差 B1和bb_ 8
虚基类永远在最下面
虚基类的成员是由最远派生类的构造函数通过虚基类的构造函数进行初始化的
虚基类构造函数是谁调用的? 最远派生类
☆对象的动态创建