最近关于各种不同的继承方式导致的内存变化有点晕,特意拿出来整理下,防止后续遗忘(下面全部是在32位程序下的)
1.无继承,此类比较直观简单,无需多说
2.继承
1.基类不存在虚函数的,只需要累加基类的大小即可,注意在派生类的内存中,基类的变量位置在派生类的前面
2.基类存在虚函数的:基类中存在虚函数,则派生类必定是存在虚表指针的,虚表里面的函数则根据类的多态机制来决定,即如果MemoryB 里面是的funB()修改为funA(),则B的虚表里面应该是MemoryB::funA();MemoryC同MemoryB
3.虚继承
虚继承一般用在棱形继承上,此处不讨论实际应用场景。
如果是虚继承,则不管基类or派生类是否存在虚函数,都会在派生类中存在一个虚表指针,切这种情况下,内存布局中,基类的是在派生类后面的。比如:MemoryB中,虚继承对应的虚表指针---data_b_---A的虚表指针---data_a_;MemoryD中,虚表指针---data_d_---data_c_.
4.多继承
4.1多重继承中(非虚继承),若基类无虚函数,则派生类中是否存在虚表,则根据派生类中是否存在虚函数;基类中存在虚函数的情况下,几个基类中存在虚函数则派生类中会有几个虚表指针
4.2多重虚继承
多重虚继承,会在派生类中维护一个虚继承的虚表(1个,根据继承顺序,里面按序保存虚继承基类的指针);虚继承的基类和派生类里面的虚函数会放在不同的虚表中。