- 简单示例
- windows菜单下找到vs下的开发人员命令提示符
- 若不在程序目录下,需要进入程序所在位置,去网上搜查看命令即可
- 使用虚继承解决菱形继承导致两份数据的问题
- 不使用虚继承:
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