虚拟继承情况下类的意外大小



有人可以解释一下在涉及虚函数的虚拟继承的情况下类的大小吗?代码如下:

class A
{
public:
char c;
virtual void z();
};
class B : public virtual A
{
double x;
char a, b;
int m, n;
public:
virtual void z();
virtual int p() { return 0; }
};

B类的大小为48。

这取决于您的实现。 在您的示例中,除了实现不佳之外,没有理由在 64 位计算机上将 sizeof(B(> 32。

在正常的实现中,"虚拟"类(具有虚拟方法或基的类(需要每个虚拟基vtable指针(如果有虚拟方法而没有虚拟基,则至少需要一个指针(,并且在某些情况下可能需要额外的(非虚拟(基,并且可能需要额外的vtable指针。 还有一些优化可以减少这种情况(特别是链接时类布局(。

最新更新