C++类中有两种成员变量,三种成员函数:
其中对象的内存布局中只包含非静态的成员变量,静态的成员变量是在全局数据区。
C++中类的继承类型,以及对应的类实例内存布局如下图:
1. 单继承
继承情况如下:
对应的对象内存布局:
2. 一般多继承(非菱形)
继承情况如下:
对应的对象内存布局:
3. 一般多继承(菱形)
类继承情况:
对应的对象内存布局:
4. 单虚继承
虚继承解决了菱形继承中最派生类拥有多个间接父类实例的情况。虚继承的派生类的内存布局与普通继承很多不同,主要体现在:
- 虚继承的子类,如果本身定义了新的虚函数,则编译器为其生成一个虚函数指针(vptr)以及一张虚函数表。该vptr位于对象内存最前面。
- vs非虚继承:直接扩展父类虚函数表。
- 虚继承的子类也单独保留了父类的vprt与虚函数表。这部分内容接与子类内容以一个四字节的0来分界。
- 虚继承的子类对象中,含有四字节的虚表指针偏移值。
类的继承关系:
对应的对象内存布局:
5. 多虚继承(菱形)
类的继承关系:
对应的对象内存布局:
参考:
1. https://www.cnblogs.com/QG-whz/archive/2015/10/25/4909359.html