我有一个带有虚拟析构函数的类'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”的大小时没有添加它的大小呢?
有没有人能澄清一下。
发布于 2012-06-05 22:36:59
这都是特定于实现的。但在实践中,派生类中将只有一个vptr;不需要两个。base的全部意义在于它被用来动态调用虚拟函数的正确覆盖;vptr对象只是有一个不同的指向vptr对象的指针值。
注意:您的示例可能会被以下事实所混淆(无意中?)使用私有继承,而不是更典型的公共继承...
发布于 2012-06-05 22:45:09
我认为您混淆了vtables和vptrs。每个类都将有一个vtable,并且每个对象将存储一个指向其vtable的指针作为vptr。vtable就像一个静态全局表,它在类的所有实例之间共享,因此不会占用对象中的任何空间。
https://stackoverflow.com/questions/10899319
复制相似问题