C++类对象在17种情况下的内存布局
测试环境:VS2015
写在前面:子类的虚析构函数位于虚表第一位;若子类仅重写父类一部分虚函数,那么父类未被重写的虚函数位于虚表中:子类重写函数之后、子类自身虚函数之前。
单个类
class A;

class A; // 自身有虚函数

单继承
class A; // 没有虚函数 class B : public A;

class A; // 有虚函数 class B : public A; // 重写父类的虚函数,自身没有虚函数

多重继承
class A; class B; class C : public A, public B; // 继承顺序不同会影响布局

class A; // 没有虚函数 class B; // 有虚函数 class C : public A, public B; // 重写父类虚函数,自身有虚函数(请注意成员顺序)

class A; // 有虚函数 class B; // 有虚函数 class C : public A, public B; // 重写父类虚函数,自身有虚函数(请注意成员顺序)

单虚继承
class A; // 没有虚函数 class B : virtual public A; // 没有虚函数

class A; // 有虚函数 class B : virtual public A; // 重写虚基类虚函数,自身不包含虚函数

class A; // 有虚函数 class B : virtual public A; // 重写虚基类的虚函数,自身包含虚函数

菱形继承
class A; // 没有虚函数 class B : virtual public A; // 没有虚函数 class C : virtual public A; // 没有虚函数 class D : public B, public C; // 没有虚函数

class A; // 有虚函数 class B : virtual public A; // 不重写虚基类的虚函数,自身没有虚函数 class C : virtual public A; // 不重写虚基类的虚函数,自身没有虚函数 class D : public B, public C; // 不重写虚基类、父类的虚函数,自身没有虚函数

class A; // 有虚函数 class B : virtual public A; // 不重写虚基类的虚函数,自身有虚函数 class C : virtual public A; // 不重写虚基类的虚函数,自身没有虚函数 class D : public B, public C; // 不重写虚基类、父类的虚函数,自身没有虚函数

class A; // 有虚函数 class B : virtual public A; // 不重写虚基类的虚函数,自身有虚函数 class C : virtual public A; // 不重写虚基类的虚函数,自身有虚函数 class D : public B, public C; // 不重写虚基类、父类的虚函数,自身没有虚函数

class A; // 有虚函数 class B : virtual public A; // 不重写虚基类的虚函数,自身有虚函数 class C : virtual public A; // 不重写虚基类的虚函数,自身有虚函数 class D : public B, public C; // 不重写虚基类、父类的虚函数,自身有虚函数

class A; // 有虚函数 class B : virtual public A; // 重写不重写虚基类的虚函数不影响结果,自身有虚函数 class C : virtual public A; // 重写不重写虚基类的虚函数不影响结果,自身有虚函数 class D : public B, public C; // 重写虚基类、父类的虚函数,自身有虚函数

class A; // 有虚函数 class B : virtual public A; // 重写虚基类的虚函数,自身有虚函数 class C : virtual public A; // 不重写虚基类的虚函数(如果两个父类都重写,会有二义性,无法通过编译),自身有虚函数 class D : public B, public C; // 不重写虚基类(如果重写,与上一种情况的结果相同)、重写父类的虚函数,自身有虚函数


浙公网安备 33010602011771号