子对象中VPTR的存在

时间:2012-06-05 14:35:11

标签: c++ virtual vptr

我有一个带有虚拟析构函数的类'base',因此有一个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个字节时)。

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

请有人澄清一下。

2 个答案:

答案 0 :(得分:4)

这是特定于实现的。但实际上,派生类中只有一个vptr;没有必要两个。 vptr的重点是它用于动态调用虚函数的正确覆盖; der个对象只有一个与base个对象不同的指针值。

[注意:你的例子很可能是因为你(无意中?)使用私有继承,而不是更典型的公共继承...]

答案 1 :(得分:2)

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