【问题标题】:C++ size of virtual inheritance classes虚拟继承类的 C++ 大小
【发布时间】:2023-03-22 12:50:02
【问题描述】:

这是我的代码:

#include <iostream>
using namespace std;
class MyClass{
    int mem1;
    float mem2;
};
class MyKids: public virtual MyClass{
    int cmem1;
    int cmem2;
};
class MyLawKids:public virtual MyClass{
    int lmem1;
};
class MyGrands:public MyKids, public MyLawKids{
    int gmem1;
};

int main(){
    cout << "\n Size of MyClass: " << sizeof(MyClass) << " bytes" << endl ;
    cout << " Size of MyKids: " << sizeof(MyKids) << " bytes" << endl ;
    cout << " Size of MyLawKids: " << sizeof(MyLawKids) << " bytes" << endl ;
    cout << " Size of MyGrands: " << sizeof(MyGrands) << " bytes" << endl ;
    return 0;
}

结果:

 Size of MyClass: 8 bytes
 Size of MyKids: 20 bytes
 Size of MyLawKids: 16 bytes
 Size of MyGrands: 32 bytes

Process returned 0 (0x0)   execution time : 0.094 s
Press any key to continue.

我认为 MyGrands 类的大小应该是 36 字节 = (sizeof(MyKids + MyLawKids + int gmem1) - 4 字节的虚拟表指针)。

为什么我的结果显示“MyGrands 的大小:32 字节”?

【问题讨论】:

  • stackoverflow.com/questions/119123/…(涉及填充,不同的编译器或平台可能导致不同的结果)
  • 虚拟继承,你可以(可能)不用的多重继承。
  • 顺便说一句,您观察到的大小差异只是虚拟继承的结果。任何关于虚拟继承的文章都应该包含对你看到的效果的解释

标签: c++ class inheritance virtual sizeof


【解决方案1】:

MyGrands 仅包含一个 MyClass 实例,因为 MyKids 和 MyLawKids inheriting virtually 来自 MyClass。因此,通过重复计算 MyClass 的大小,您的计算是错误的。顺便说一句,一般来说,你不应该依赖简单地添加与整体大小相同的部分。编译器可以添加填充。

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2013-02-26
    • 2019-12-20
    • 1970-01-01
    • 2020-02-01
    • 2012-05-19
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多