- 多继承派生类对象内存布局:先放有虚函数的基类,接着放没有虚函数的基类,然后是派生类自己的数据成员
- 在多继承下,有多少个虚函数的基类就有多少个虚函数表指针
- 派生类中新增的虚函数,添加在第一张虚函数表中
- 在派生类对象中,同名的虚基类只产生一个虚基类子对象,而同名的非虚基类则各产生一个非虚基类子对象
- 虚基类的子对象是由最后派生出来的类的构造函数通过调用虚基类的构造函数来初始化的
- 虚基类并不是在声明基类时声明的,而是在声明派生类时通过指定其继承该基类的方式来声明的。
- 虚继承的调用次序:首先按照虚基类的声明顺序调用虚基类的构造函数(并以此类推),然后按照非虚基类的声明顺序调用非虚基类的构造函数
- 虚继承,虚基类<-----没有关系---------->虚函数,纯虚函数,抽象基类
- 虚继承是解决c++多重继承问题(浪费空间--多份拷贝;二义性问题--多份拷贝的基类无法用指针或者引用操作派生类对象)的一种手段
- 虚继承底层实现与编译器相关,一般是通过虚基类表指针和虚基类表实现,每个虚继承的派生类都有一个虚基类表指针和虚基类表,当虚继承的派生类被当做基类继承时,虚基类表指针也会被继承
- 虚继承对比虚函数的实现原理:相似之处:都利用了虚指针(占用类对象的存储空间)和虚表(不占用类对象的存储空间)
- 虚基类仍然存在继承类中,要占用对象的存储空间;虚函数不占用对象存储空间
- 虚基类表存储的是虚基类相对直接继承类的偏移;而虚函数表存储的是虚函数地址
- 虚函数表vtable在Linux/Unix中存放在可执行文件的只读数据段中(rodata),这与微软的编译器将虚函数表存放在常量段存在一些差别。参考:https://blog.youkuaiyun.com/u013270326/article/details/81259863
- 虚基类表的内容有所不同。表的第一项表示派生类对象指针相对于虚基类表指针的偏移,从第二项开始表示各个基类地址相对于虚基类表指针的偏移。参考:https://www.bbsmax.com/A/D854XjaW5E/