4

Virtual base class is a way of preventing multiple instances of a given class appearing in an inheritance hierarchy when using multiple inheritance . Then for the following classes

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();
};

I got following sizes of the classes

size of level0 4

size of level10 12

size of level11 12

size of level2 24

but when I removed virtual from inheritance of level10 and level11 I got following output

sizeof level0 4

sizeof level10 8

sizeof level11 8

sizeof level2 20

If virtual inheritance prevents multiple instances of a base class, then why size of classes is greater in case of virtual inheritance?

4

2 回答 2

5

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


  • “将创建”——vtables 不是由标准规定的,但虚拟继承所暗示的行为是。大多数编译器使用 vtables 来实现标准规定的功能。
于 2013-06-24T19:14:06.040 回答
0

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

级别0 4的大小

level10 16的大小

level11 16的大小

level2 的大小 32

于 2019-04-21T12:24:24.137 回答