0

我有一个带有虚拟析构函数的类“基础”,因此有一个 VTable 和相应的 VTPR,以及一个从它派生的类:

class base {
public:
    virtual ~base() {}
};

class der : base {};

main()
{

    int a = sizeof(base); // = 4 , fine !

    int b = sizeof(der);  // = 4 too ?
}

现在,由于派生类也是虚拟的,它会有自己的 VPTR,但由于它还有一个基类的子对象,其中有一个 VPTR,所以“der”类的大小不应该是 8 个字节,即'der' 类的 VPTR 的大小 + 'base' 类的子对象的 VPTR 的大小?(当 sizeof(void*) = 4 bytes 时)。

所以基本上我的问题是:当类 'base' 的子对象是在 'der' 中制作时,它有一个单独的新 VPTR 吗?如果是这样,那么为什么在计算“der”的大小时没有添加它的大小?

有人可以澄清一下吗。

4

2 回答 2

4

这都是特定于实现的。但实际上,派生类中只会有一个vptr;不需要两个。vptr 的全部意义在于它习惯于动态调用正确的虚函数覆盖;der对象将只是具有指向base对象的不同指针值。

[注意:您的示例可能对您(无意中?)使用私有继承而不是更典型的公共继承这一事实感到困惑......]

于 2012-06-05T14:36:59.363 回答
2

我认为您混淆了 vtables 和 vptrs。每个类都有一个 vtable,每个对象都会存储一个指向其 vtable 的指针作为 vptr。vtable 就像一个静态全局变量,它在类的所有实例之间共享,因此不占用对象中的任何空间。

于 2012-06-05T14:45:09.337 回答