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;  // 不重写虚基类(如果重写,与上一种情况的结果相同)、重写父类的虚函数,自身有虚函数

posted @ 2021-08-26 22:13  HyperVS  阅读(191)  评论(0)    收藏  举报