如何使用多重继承消除基类中的变量副本?

时间:2010-11-11 19:56:49

标签: c++

如标题所述,我有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'?

3 个答案:

答案 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。

  • 第一名:int = 4.
  • 第二名:int + double = 4 + 8 = 12,最多为16
  • 组合:int + second = 4 + 16 = 20,向上舍入到24。

是的,第一个::数据在组合中重复。使用虚拟继承(请参阅其他答案)来解决这个问题。或者调整你的继承关系。

这样做是为了增加内存访问时间,但需要额外使用内存。

如果无法释放额外的内存,请查找编译器魔术以将对齐设置为较低的值。幸运的是,这很少需要。

答案 2 :(得分:1)

如果你真的需要这种结构,你可以使用虚拟继承:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9