如标题所述,我有3个班级:
#include <iostream>
using namespace std;
class first
{
protected :
int data;
public :
first()
:data( 1 )
{
// empty
}
};
class second : public first
{
protected :
double x;
public :
second()
:first()
{
// empty
}
};
class combine : public first, public second
{
public :
combine()
{
// empty
}
};
int main()
{
combine c;
cout << sizeof( c ) << endl;
return 0;
}
当我检查sizeof(第一个)是4对我来说有意义。但我不知道为什么sizeof(秒)是16(我假设4 + 8 = 12!= 16),而sizeof(联合)是24(4 + 4 + 8 = 16!= 24)。有人能帮我解释一下吗? 此外,当'合并'多重继承自'第一'和'第二'时,我意识到其大小包含数据< / strong>(int)来自'第一个'和'第二个'类;这是浪费记忆。有没有办法解决这个问题,即让'first'和'second'共享一份'data'?
答案 0 :(得分:5)
这就是虚拟继承的用途。为了防止first
被复制,您(直接)从first
派生一个类,您需要将继承设为虚拟,因此您需要:
class second : public virtual first { // ...
class combine : public virtual first, public second { // ...
答案 1 :(得分:3)
看起来对齐方式设置为8.这意味着大于8的每个大小都会向上舍入为8的倍数。小于8的大小将四舍五入为8,4,2或1。
E.g。
是的,第一个::数据在组合中重复。使用虚拟继承(请参阅其他答案)来解决这个问题。或者调整你的继承关系。
这样做是为了增加内存访问时间,但需要额外使用内存。
如果无法释放额外的内存,请查找编译器魔术以将对齐设置为较低的值。幸运的是,这很少需要。
答案 2 :(得分:1)
如果你真的需要这种结构,你可以使用虚拟继承:
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9