首页 文章

子对象中VPTR的存在

提问于
浏览
0

我有一个带有虚拟析构函数的类'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字节,即'base'子对象的VPTR类的'der'大小的VPTR的大小? (当sizeof(void *)= 4个字节时) .

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

有人可以澄清这一点 .

2 回答

  • 4

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

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

  • 2

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

相关问题