考虑以下程序:
#include<iostream>
using namespace std;
class base {
int arr[10];
};
class b1: virtual public base { };
class b2: virtual public base { };
class derived: public b1, public b2 {};
int main(void)
{
cout<<sizeof(derived);
return 0;
}
据我所知,由于虚拟基类,数组 arr 在类中仅被继承一次。因此,派生类的 sizeof 应该是 10*4=40 字节。但是,在执行时,该程序将打印 56 作为输出。我什至检查了编译器上 int 的大小,它只有 4 个字节。有人能解释一下额外的 16 个字节是从哪里来的吗?
答案 0 :(得分:0)
这可能是保存虚函数地址的 v-table 的大小。如果你检查 b1
或 b2
,它是 48 个字节,可能是一个指向 v-table 的指针(64 位系统上的指针是 8 个字节)。同样的事情发生在下一个继承增加 8 的大小。
附注:我认为它是 v-table 因为如果你将代码编译为 32 位程序,大小的增加将是 4 个字节(32 位系统中的指针)。另外,如果去掉virtual
关键字,大小就不会再增加了,所以很明显跟virtual
调用有关,首先想到的是v-table。