gpt4 book ai didi

c++ - 多重继承的虚函数表

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:42 25 4
gpt4 key购买 nike

示例代码如下:

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

似乎 B 类 有自己的新虚函数表。

如果 A 类 更改为:

class A
{
public:
virtual int f();
};

打印

4 4

谁能解释一下原因?

最佳答案

在您的子类 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,分配给sizeof A对象的最小大小是vtbl的指针sizeof = 4由于 A 在实例数据方面是空的,因此空类的虚拟继承不会增加对象的大小

关于c++ - 多重继承的虚函数表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25522970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com