sdsad asdasd sdsad asdasd - 2 months ago 15
C++ Question

Are base class objects implicitly added to derived classes?

I have just read about subobjects in the Standard saying this:


A subobject can be a member subobject (9.2), a base
class subobject (Clause 10), or an array element.


I have encountered a lot of situations when reading about C++ where subojects were mentioned without even having a subobject(explicitly defined) in the derived class.

But does this mean that whenever a class has a base class, the compiler implicitly adds an object of the base class type in the derived class?

Like:

class Base
{
};
class Derived : Base
{
};


So a subobject of Base has been added in Derived?

Is there something in the Standard that I should have read? I am aware of that it was a very tiny quotation though.

Update:

If we had these classes:

class Base
{
int anint;
float afloat;
};
class Derived : Base
{
//inherited member variables...
};


So in the code above, are
anint
,
afloat
subobjects of
Base
? Are
anint
and
afloat
also subobjects of
Derived
? AND is there also added a member to
Derived
that looks like
Base something
? So in the end,
Derived
has three subobjects:
anint
,
afloat
and
Base something
?

Answer Source

Well, yes. The most derived class will contain sub-objects of each class it derives from. To quote C++17 (n4659 draft), [class.derived/3]:

The base-specifier-list specifies the type of the base class subobjects contained in an object of the derived class type. [ Example:

struct Base {
  int a, b, c;
};
struct Derived : Base {
  int b;
};
struct Derived2 : Derived {
  int c;
};

Here, an object of class Derived2 will have a subobject of class Derived which in turn will have a subobject of class Base.  — end example ]

The term sub-object is used more generally because inheritance is not the only way to form aggregate types. You can add members to a class, those will be sub-objects as well. And when you form arrays, each element is a sub-object of the array as a whole.


To address your update to the question:

So in the code above, are anint, afloat subobjects of Base?

Yes. They are members of Base and therefore sub-objects of it. Their memory location is laid out inside the memory of a Base object.

Are anint and afloat also subobjects of Derived?

Yes, on account of inclusion being transitive. Derived contains a sub-object of Base.

AND is there also added a member to Derived that looks like Base something?

There is no named member for the Base sub-object. There is only a chunk of memory inside a Derived object that has a Base object constructed in it.

So in the end, Derived has three subobjects: anint, afloat and Base something?

Yes. It looks like somewhat this:

+----------------------+
|+--------------------+|
|| int    |   float   ||
|+--------------------+|
| Base object (unnamed)|
+----------------------+
  Derived object