示例代码如下:
class A
{
public:
int k;
virtual int f();
};
class B:public virtual A
{
public:
virtual int a();
};
int main()
{
cout<<sizeof(A)<<sizeof(B);
}印出来
8 12
class B似乎有自己的新的虚拟函数表。
如果class A更改为:
class A
{
public:
virtual int f();
};印出来
4 4
有人能解释原因吗?
发布于 2014-08-27 09:29:53
在您的子类B中,B是A的一个虚拟子类,因此,B在子对象A上有一个单独的vtbl指针(4个字节)。
sizeof(B object)
= sizeof(A object) + sizeof (vtbl pointer of B)
= sizeof(int) + sizeof (vtbl pointer of A) + sizeof (vtbl pointer of B)
= 4 + 4 + 4
= 12和,
sizeof(A object)
= sizeof(int) + sizeof (vtbl pointer of A)
= 4 + 4
= 8如果B是A的正常子类,
sizeof(B object)
= sizeof(A object)
= sizeof(int) + sizeof (vtbl pointer of A)
= 4 + 4
= 12对于空类A,为size of A对象分配的最小大小为vtbl =4的指针大小,而且由于A在实例数据方面是空的,所以空类的虚拟继承不会增加对象的大小
发布于 2014-08-27 09:26:52
在类继承的上下文中,“虚拟”的意思是“在运行时确定”。有两种不同的东西可以是虚拟的,实现必须以某种方式实现:
x.f() -谁是f?常见的实现包括函数指针表。x.a = 10 - a在哪里?这方面的常见实现包括指针偏移量计算。如果一个虚拟基类没有状态(这与“是空的”类似,但不是等价的),那么第二个用例就变成空的了。由于不存在必须动态确定位置的数据成员,因此实现不需要为此生成任何信息,对象也不需要存储相关的引用。
一种流行的C++ ABI,Itanium,详细描述了虚拟化是如何实现的。还有这篇受欢迎的文章解释了这个实现。
https://stackoverflow.com/questions/25522970
复制相似问题