参考出自:
https://blog.youkuaiyun.com/ljianhui/article/details/45903939
https://www.cnblogs.com/QG-whz/p/4909359.html
类实例化后该类对象成员内存分布情况。
有虚函数的类,都会给该类分配一个虚函数表。
在类对象内存内:虚函数指针、根据声明顺序的非静态数据成员
在类对象内存外:type_info(RTTI(运行时类型识别) 通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型),虚函数表,静态数据成员,静态函数,非静态函数。其中在代码区:非静态函数;全局/静态存储区:虚函数表(所有类共用一份猜出在全局区),静态数据成员,静态函数;
单继承: 子类对象内存内分布依次:虚函数指针,父类非静态数据成员,子类非静态数据成员。类对象的虚函数表成员有父类虚函数、子类虚函数。如果子类重写父类虚函数,那就替换了改父类函数。
普通多继承:
多重继承(多个父类)。有多个有虚函数父类,子类内存相应多个虚函数指针分别指向多个虚表,每个虚函数表有有父类虚函数、子类虚函数。
类的继承关系如下:class Derived : public Base1, public Base2
Derived类的对象的内存布局为:基类Base1子对象和基类Base2子对象及Derived类的非static成员变量组成。基类子对象包括其虚函数表指针和其非static的成员变量。有多个有虚函数父类,子类内存相应多个虚函数指针指向虚表,每个虚函数表有有父类虚函数、子类虚函数。
重复继承
重复继承(继承的多个父类中其父类有相同的超类),有多个有虚函数父类,子类内存相应多个虚函数指针分别指向多个虚表,每个虚函数表有有父类虚函数、子类虚函数。
类的继承关系如下:
class Base1 : public Base
class Base2: public Base
class Derived : public Base1, public Base2
Derived类的对象的内存布局与多继承相似,但是可以看到基类Base的子对象在Derived类的对象的内存中存在一份拷贝Base。这样直接使用Derived中基类Base的相关成员时,就会引发歧义,可使用多重虚拟继承消除之。
多重虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)
类的继承关系如下:
class Base1 : virtual public Base
class Base2: virtual public Base
class Derived : public Base1, public Base2
Derived类的对象的内存布局与重复继承的类的对象的内存分布类似,但是基类Base的子对象没有拷贝一份,在对象的内存中仅存在在一个Base类的子对象。但是它的非static成员变量放置在对象的末尾处。