继承的分类:
1.单继承
创建一个Student的对象,看一下他的内存分布是怎样的:
2.多继承
对虚函数进行重写的多继承:
3.多重继承
4.菱形继承
虚拟继承
在虚拟继承中,我们可以看到,子类成员和基类成员的存储顺序发生了改变,并且在b对象的前四个字节中存放了一些东西,是我们呢不曾了解的:,下面就来研究一下:
在观察前四个字节中存放的内容中,我们可以看到存放了0和8,通过了解知道8代表着基类对象成员在子类对象中与子类对象首地址的偏移量。减去
=8。
将派生类的前四个字节所指向的内容叫做偏移量表格
菱形虚拟继承
还记得之前普通菱形继承中成员_a在继承中,B和C对象中都有一份_a,这就叫数据冗余,用虚拟菱形继承可以解决
这里可以分析出D对象中将_a放到的了对象组成的最下面,这个_a同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。
菱形虚拟继承虽然解决的菱形继承里子类对象包含对分父类对象的数据冗余浪费空间的问题,单因为要给对象分配内存去存储虚表,但也带来了性能上的损耗。