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)。 但是这个虚拟指针指向什么?
答案 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位系统上,这意味着 虚拟继承可能会将对象的大小增加四倍 你观察到的字节数。