我有一个带有虚拟析构函数的类'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 回答
这是特定于实现的 . 但实际上,派生类中只有一个vptr;没有必要两个 . vptr的重点是它用于动态调用虚函数的正确覆盖;
der
对象将只有一个与base
对象不同的指针值 .[注意:你的例子可能因为你(无意中?)使用私有继承而不是更典型的公共继承这一事实而感到困惑......]
我认为你混淆了vtable和vptrs . 每个类都有一个vtable,每个对象都将一个指向vtable的指针存储为vptr . vtable类似于静态全局,它在类的所有实例之间共享,因此不占用对象中的任何空间 .