nikitas350
nikitas350

Reputation: 57

Objects with inheritance memory storage

Say that i have some classes like this example.

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;
     }
};

Now, in a class C object, are the variables stored in a specific way? I know what happens in a POD object, but this is not a POD object...

Upvotes: 5

Views: 309

Answers (2)

Daniel Trebbien
Daniel Trebbien

Reputation: 39208

In the introduction of Chapter 10, Derived classes, the C++ Standard mentions:

The order in which the base class subobjects are allocated in the most derived object (1.8) is unspecified.

So, in your example C objects each have a base class subobject of type A and a base class subobject of type B, but whether the A base member comes before or after the B base member is unspecified.

Upvotes: 2

Sergei Tachenov
Sergei Tachenov

Reputation: 24869

Although I'm not sure if it's required by the standard, in any reasonable implementation I'm aware of they are stored in this order: A::k, A::m, B::k, B::m, C::k, C::m (possibly aligned according to the hardware's requirements). The only practical reason in this knowledge I can think of is that you need to understand that if you cast a pointer to C to a pointer to B, then its value (the address) will be different, so you should be very careful about such casts (don't use reinterpret_cast<> for this, for example).

Upvotes: 0

Related Questions