虚拟继承中派生类对象的大小

时间:2013-12-28 07:42:58

标签: c++

class base
{
};

class der_1:public base
{
};

class der_2:virtual public base
{
};

int main()
{
    der_1 a;  //size of a is 1
    der_2 b;  //size of b is 4  ?? why
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
    return 0;
}

对象b内部包含虚拟指针,因此其大小为4而不是1(如a)。 但是这个虚拟指针指向什么?

3 个答案:

答案 0 :(得分:6)

这纯粹依赖于实现。这取决于实现如何实现动态调度/虚拟主义。这就是C ++标准库提供sizeof以获得实际大小的原因,这样您就不必猜测/估计它。始终使用它而不是对尺寸做出任何假设。

但是大多数实现( read all )都使用虚拟表和指针机制来实现这一点,你看到的额外4个字节大小是用于vptr簿记。

答案 1 :(得分:5)

它可能指向该类的虚函数表。在大多数实现中,这是必要的,以允许dynamic_cast之类的工作。

答案 2 :(得分:2)

指针的大小因机器而异。例如,在我的机器上,它是8

Size of the classes in case of virtual inheritance

  

每当你有虚拟继承时,虚拟的位置   关于完整类型的开始的基础子对象是   未知,因此将额外的指针添加到要跟踪的原始对象   虚拟基地在哪里。

Does virtual inheritance increase the size of derived class?

  

此行为完全针对特定于实现并且没有   关于将会发生什么的保证。也就是说,大多数编译器都会实现   通过使基类的单个副本所在的虚拟继承   周围,​​然后让派生类的每个实例存储一个指针   在其类主体内,指向一个唯一的实例。那   方式,如果将对象强制转换为虚拟基础,编译器就可以发出   用于找出该对象所在位置的代码。在32位系统上,这意味着   虚拟继承可能会将对象的大小增加四倍   你观察到的字节数。