对象与继承的内存存储

5

假设我有一些类似于以下示例的类。

class A {
     int k, m;
public:
     A(int a, int b) {
          k = a;
          m = b;
     }
};

class B {
     int k, m;
public:
     B() {
          k = 2;
          m = 3;
     }
};

class C : private A, private B {
     int k, m;
public:
     C(int a, int b) : A(a, b) {
          k = b;
          m = a;
     }
};

现在,在一个C++类对象中,变量是以特定的方式存储的吗?我知道POD对象中会发生什么,但这不是一个POD对象...

2个回答

2
在第10章派生类的介绍中,C++标准提到:
“在最派生对象(1.8)中分配基类子对象的顺序是未指定的。”
因此,在您的示例中,每个C对象都有一个类型为A的基类子对象和一个类型为B的基类子对象,但是A基类成员出现在B基类成员之前还是之后是未指定的。

0

虽然我不确定标准是否要求这样做,但在我所知道的任何合理实现中,它们按照以下顺序存储:A::k、A::m、B::k、B::m、C::k、C::m(可能根据硬件要求进行对齐)。我能想到的唯一实际原因是你需要了解,如果你将指向 C 的指针强制转换为指向 B 的指针,则其值(地址)将不同,因此你应该非常小心这样的转换(例如,不要使用 reinterpret_cast<>)。


这对于许多实现可能是正确的,但我认为没有任何保证。 - user180326
@jdv,没错,这可能是实现特定的,但我想不出其他的实现方式。不过应该在答案中添加一条注释。 - Sergei Tachenov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接