如果类使用虚拟继承,为什么对象大小会增加?

时间:2018-06-02 12:38:57

标签: c++ class inheritance virtual

在以下代码中:

#include <iostream>

class a {
    char a;
};

class b : virtual public a {
    char b;
};

class c : virtual public a {
    char c;
};

class d : public b, public c {
    char d;
};

int main() {
    std::cout << "sizeof a: " << sizeof(a) << std::endl;
    std::cout << "sizeof b: " << sizeof(b) << std::endl;
    std::cout << "sizeof c: " << sizeof(c) << std::endl;
    std::cout << "sizeof d: " << sizeof(d) << std::endl;
    return 0;
}

输出是:

sizeof a: 1
sizeof b: 16
sizeof c: 16
sizeof d: 32

我想知道为什么增加的尺寸是16。 char的大小为1表示增加的大小为15。 我知道虚拟类需要一个指向其偏移量的指针,它增加了4个字节,然后11个字节没有任何意义。 任何人都可以解释为什么会发生, 我的问题不同,因为它是钻石继承案例

1 个答案:

答案 0 :(得分:2)

虚拟继承用于解决多重继承中的Diamond问题。

虚拟继承将在子类的每个对象中创建vtable pointer

它会增加子类对象的大小,增加的大小取决于代码所遵循的操作系统。可能是您的代码已在OS 64位中编译,因此vtable pointer的大小为8个字节。但你想知道为什么sizeof(b) = 16.答案是Memory alignment机制。你可以参考下面的链接,了解我说的更多内容,并抱歉我的英语语法不好。

内存对齐和填充:

http://www.cplusplus.com/forum/articles/31027/

虚拟继承:

https://www.cprogramming.com/tutorial/virtual_inheritance.html