首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重继承的虚函数表

多重继承的虚函数表
EN

Stack Overflow用户
提问于 2014-08-27 08:59:52
回答 2查看 490关注 0票数 6

示例代码如下:

代码语言:javascript
复制
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更改为:

代码语言:javascript
复制
class A
{
public:
    virtual int f();
};

印出来

4 4

有人能解释原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-27 09:29:53

在您的子类B中,B是A的一个虚拟子类,因此,B在子对象A上有一个单独的vtbl指针(4个字节)。

代码语言:javascript
复制
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

和,

代码语言:javascript
复制
sizeof(A object)
= sizeof(int) + sizeof (vtbl pointer of A)
= 4 + 4
= 8

如果B是A的正常子类,

代码语言:javascript
复制
 sizeof(B object) 
    = sizeof(A object) 
    = sizeof(int) + sizeof (vtbl pointer of A) 
    = 4 + 4
    = 12

对于空类A,为size of A对象分配的最小大小为vtbl =4的指针大小,而且由于A在实例数据方面是空的,所以空类的虚拟继承不会增加对象的大小

票数 1
EN

Stack Overflow用户

发布于 2014-08-27 09:26:52

在类继承的上下文中,“虚拟”的意思是“在运行时确定”。有两种不同的东西可以是虚拟的,实现必须以某种方式实现:

  • 虚拟函数,要调用的实际函数必须在运行时确定:x.f() -谁是f?常见的实现包括函数指针表。
  • 虚拟继承,其中虚拟基子对象直到运行时才知道。实现必须提供一种定位实际基本对象的机制:x.a = 10 - a在哪里?这方面的常见实现包括指针偏移量计算。

如果一个虚拟基类没有状态(这与“是空的”类似,但不是等价的),那么第二个用例就变成空的了。由于不存在必须动态确定位置的数据成员,因此实现不需要为此生成任何信息,对象也不需要存储相关的引用。

一种流行的C++ ABI,Itanium,详细描述了虚拟化是如何实现的。还有这篇受欢迎的文章解释了这个实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25522970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档