多继承
一个类有多个直接基类的继承关系称为多继承
多继承声明语法class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n
{
数据成员和成员函数声明
};
如果基类没有无参构造的话,需要在对象初始化列表中显示调用基类的构造函数
基类的构造顺序和在对象列表中调用顺序无关,和在继承时候的继承顺序有关
基类指针可以指向派生类
基类指针指向派生类,基类指针不一定和派生类指针重合,会根据在派生类中的排布做相应的偏移
基类指针操作派生类对象在多继承中也是可以使用
二义性
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
要使这个公共基类在派生类中只产生一个子对象(只调用一次公共基类的构造函数),必须对这个基类声明为虚继承,使这个基类成为虚基类。
虚继承声明使用关键字 virtual
虚继承对象模型的内存排布顺序
1、虚继承后会新增一个成员指针: vbptr 用来寻找虚基类成员,指针排列在对象内存的最开始部分(不一定在最开头),
vbptr指针的指向:1、当前对象的指针和vbptr自身的偏移量(对象指针 - vbptr),2、虚基类指针和vbptr的偏移量
2、排列虚基类成员
3、排列派生类自己的成员
4、排列虚基类成员(只有一份)