虚拟基类是一种在使用多重继承时阻止给定类的多个实例出现在继承层次结构中的方法。然后是以下课程
class level0 {
int a;
public :
level0();
};
class level10:virtual public level0 {
int b;
public :
level10();
};
class level11 :virtual public level0 {
int c;
public :
level11();
};
class level2 :public level10,public level11 {
int d;
public:
level2();
};
我有以下大小的课程
等级0 4
等级10 12
等级11 12
级别2 24
但是当我从level10和level11的继承中删除虚拟时,我得到了以下输出
sizeof level0 4
sizeof level10 8
sizeof level11 8
sizeof level2 20
如果虚拟继承阻止了基类的多个实例,那么为什么在虚拟继承的情况下类的大小会更大?
答案 0 :(得分:5)
因为当使用virtual
继承时,编译器将创建* a vtable以指向各种类的正确偏移量,并且指向该vtable的指针与该类一起存储。
答案 1 :(得分:0)
正如您在this中所看到的,很明显,如果使用了虚拟继承,则编译器将向对象基类添加一个偏移量指针,而不是将基类成员包括在其自身的内存中。这就是增加尺寸的原因。如果它是x64位m \ c,则指针大小将为8。输出将是以下内容
level0 4的大小
级别10的大小
level11 16的大小
级别2的大小32