我有一个带有虚拟析构函数的类'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'的大小时它的大小没有被添加?
请有人澄清一下。
答案 0 :(得分:4)
这是特定于实现的。但实际上,派生类中只有一个vptr;没有必要两个。 vptr的重点是它用于动态调用虚函数的正确覆盖; der
个对象只有一个与base
个对象不同的指针值。
[注意:你的例子很可能是因为你(无意中?)使用私有继承,而不是更典型的公共继承...]
答案 1 :(得分:2)
我认为你混淆了vtable和vptrs。每个类都有一个vtable,每个对象都会将一个指向vtable的指针存储为vptr。 vtable就像一个静态全局,它在类的所有实例之间共享,因此不占用对象中的任何空间。