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

Ais*_*ngh 4 c++ virtual inheritance

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

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();
};
Run Code Online (Sandbox Code Playgroud)

我得到了以下课程的大小

等级大小0 4

10级的大小12

11级的大小12

2级的大小24

但是当我从级别10和级别11的继承中删除虚拟时,得到以下输出

等级大小0 4

等级大小10 8

等级大小11 8

2级大小

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

Joh*_*ing 5

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


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