在以下代码中:
#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个字节没有任何意义。 任何人都可以解释为什么会发生, 我的问题不同,因为它是钻石继承案例
答案 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