gpt4 book ai didi

c++ - 具有多重继承的类的 sizeof

转载 作者:太空狗 更新时间:2023-10-29 20:35:10 24 4
gpt4 key购买 nike

首先,我知道 sizeof 取决于机器和编译器的实现。我正在使用 Windows 8.1。 x64,gcc 5.3.0.,没有标志被传递给编译器。
我的大学讲座中有以下代码:

#include <iostream>
class A
{
public:
int a;
int b;
A(){ a = 1; b = 2; }
};

class S1 : public A {
public:
int x1;
S1(){ x1 = 5;}
};

class S2 : public A {
public:
int x2;
S2(){ x2 = 6;}
};

class S12 : public S1, public S2 {
public:
int x12;
S12(){ x12 = 7;}
};

int main()
{
std::cout << "S1: " << sizeof(A) << std::endl;
std::cout << "S1: " << sizeof(S1) << std::endl;
std::cout << "S2: " << sizeof(S2) << std::endl;
std::cout << "S12: " << sizeof(S12) << std::endl;
}

在我的机器上,我得到以下输出:
S1: 8
S1: 12
S2: 12
S12: 28

我能理解为什么 S1 是 8 和 S1,S2 是 12 字节,但我不明白为什么 S12 是 28 - 我希望它是 20,因为它必须有 5 个整数变量(每个 4 字节)。< br/>为什么S12是28字节?

最佳答案

你的类(class)里有 7 个整数

S1::A::a
S1::A::b
S1::x1
S2::A::a
S2::A::b
S2::x2
x12

S12 包含两个 A 对象。如果你只想要一个 A 对象,你需要从它虚拟继承:

#include <iostream>    

struct A { int a = 1; int b = 2; };
struct S1 : virtual A { int x1 = 5; };
struct S2 : virtual A { int x2 = 6; };
struct S12 : S1, S2 { int x12 = 7; };
int main()
{
std::cout << "A: " << sizeof(A) << std::endl;
std::cout << "S1: " << sizeof(S1) << std::endl;
std::cout << "S2: " << sizeof(S2) << std::endl;
std::cout << "S12: " << sizeof(S12) << std::endl;
}

你得到的结果将比以前更依赖于实现——虚拟基类很棘手,不同的编译器倾向于为它们使用不同的实现技术。我得到:

A: 8
S1: 24
S2: 24
S12: 40

关于c++ - 具有多重继承的类的 sizeof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44271288/

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