为什么在虚拟继承的情况下类的大小更大?

时间:2013-06-24 18:59:15

标签: c++ inheritance virtual

虚拟基类是一种在使用多重继承时阻止给定类的多个实例出现在继承层次结构中的方法。然后是以下课程

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

如果虚拟继承阻止了基类的多个实例,那么为什么在虚拟继承的情况下类的大小会更大?

2 个答案:

答案 0 :(得分:5)

因为当使用virtual继承时,编译器将创建* a vtable以指向各种类的正确偏移量,并且指向该vtable的指针与该类一起存储。


  • “将创建” - vtable不受标准规定,但虚拟继承所隐含的行为是。大多数编译器使用vtable来实现标准规定的功能。

答案 1 :(得分:0)

正如您在this中所看到的,很明显,如果使用了虚拟继承,则编译器将向对象基类添加一个偏移量指针,而不是将基类成员包括在其自身的内存中。这就是增加尺寸的原因。如果它是x64位m \ c,则指针大小将为8。输出将是以下内容

level0 4的大小

级别10的大小

level11 16的大小

级别2的大小32