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

本文探讨了C++中的虚继承如何解决菱形继承导致的数据冗余问题。通过实例展示了不使用虚继承时,类的内存占用情况,并解释了使用虚继承后,如何通过虚基类指针(vbptr)和虚表(vbtable)来共享成员变量,减少内存消耗。同时,展示了32位系统下虚继承类的内存布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值