VS利用开发人员命令提示符查看类的对象模型

  1. 简单示例
  • windows菜单下找到vs下的开发人员命令提示符
  • 若不在程序目录下,需要进入程序所在位置,去网上搜查看命令即可
    在这里插入图片描述
    在这里插入图片描述
  1. 使用虚继承解决菱形继承导致两份数据的问题
  • 不使用虚继承:
class Animal {
public:
    int m_age;
};

class Sheep : public Animal { };

class Tuo : public Animal { };

class SheepTuo : public Sheep, public Tuo { };

int main() {
	// 4+4=8B,SheepTuo内部含有Sheep的m_age和Tuo的m_age
    cout << sizeof(SheepTuo) << endl;   

    return 0;
}
  • 使用虚继承
class Animal {
public:
    int m_age;
};

class Sheep : virtual public Animal { };

class Tuo : virtual public Animal { };

class SheepTuo : public Sheep, public Tuo { };

int main() {

    // 4+4+4=12B,SheepTuo含有两个vbptr和一个m_age
    cout << sizeof(SheepTuo) << endl;  

    return 0;
}
  • 对比结果:下图为vs内32位系统的结果,指针大小位4B,int为4B;vbptr是虚基类指针,由于Sheep和Tuo都是虚继承了Animal,因此它们各自都有一个vbtable,而vbptr指向它们各自的vbtable,vbtable内填的偏移量代表了它们各自的m_age的位置。下图中SheepTuo有两个vbptr,Sheep的vbptr指向Sheep的vbtable,里面填了8,代表Sheep的vbptr与它的m_age的偏移量;Tuo同理。这样,Sheep和Tuo均找到了同一个m_age,即SheepTuo内的那个m_age。因此,通过这种方式,使SheepTuo内只保留了一份m_age
    在这里插入图片描述


版权声明:本文为jiuri1005原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。