C++继承虚基类后的大小怎么理解


#include
using namespace std;
 
class A  //大小为4
{
public:
    int a;
};
class B :virtual public A  //大小为12,变量a,b共8字节,虚基类表指针4
{
public:
    int b;
};
class C :virtual public A //与B一样12
{
public:
    int c;
};
class D :public B, public C //24,变量a,b,c,d共16,B的虚基类指针4,C的虚基类指针
{
public:
    int d;
};
 
int main()
{
    A a;
    B b;
    C c;
    D d;
    cout << sizeof(a) << endl;
    cout << sizeof(b) << endl;
    cout << sizeof(c) << endl;
    cout << sizeof(d) << endl;
    system("pause");
    return 0;
}

我的运行结果:

4
24
24
48

与原文作者不同
附原文链接 https://blog.csdn.net/bxw1992/article/details/77726390?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167910674216800222860778%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167910674216800222860778&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-77726390-null-null.142^v74^insert_down4,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=c%2B%2B%E8%99%9A%E7%BB%A7%E6%89%BF&spm=1018.2226.3001.4187

sizeof和不同编译器是有关的,不同很正常

参考GPT和自己的思路:

根据你提供的代码和结果,可以解释如下:

  • 类A只有一个整型变量a,占用4字节;
  • 类B和类C都继承了虚基类A,因此每个类都会有一个指向A的虚基类表指针,占用4字节。同时,类B和C各自还有一个整型变量b和c,每个变量占用4字节,因此类B和C的大小都为12字节;
  • 类D继承了类B和类C,因此它会拥有类B和C的全部成员,包括各自的虚基类表指针和变量。因此,类D中有4个整型变量,每个变量占用4字节,加上类B和C的虚基类表指针,共占用24字节。另外,由于类B和C都继承了虚基类A,因此类D会拥有两个指向A的虚基类表指针,共占用8字节。因此类D的总大小为24+8=32字节。因为sizeof操作符的结果是字节数,因此sizeof(d)的结果应该是32字节,而不是48字节。可能是原文作者的误解或笔误导致的。