A
class-or-decltype shall denote
a (possibly cv-qualified) class type that is not
an incompletely defined class (
[class.mem]);
any cv-qualifiers are ignored
. A class
B is a
base class of a class
D if it is a direct base class of
D or a direct base class of one of
D's base classes
. A class is said to be (directly or
indirectly)
derived from its (direct or indirect) base
classes
. Members of a base class are also members of the derived class
. [
Note 2:
Base class members can be referred to in
expressions in the same manner as other members of the derived class,
unless their names are hidden or ambiguous (
[class.member.lookup])
. The scope resolution operator
:: (
[expr.prim.id.qual]) can be used
to refer to a direct or indirect base member explicitly,
even if it is hidden in the derived class
. A derived class can itself serve as a base class subject to access
control; see
[class.access.base]. A pointer to a derived class can be
implicitly converted to a pointer to an accessible unambiguous base
class (
[conv.ptr])
. An lvalue of a derived class type can be bound
to a reference to an accessible unambiguous base
class (
[dcl.init.ref])
. —
end note]
[
Example 1:
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 order in which the base class subobjects are allocated in the most
derived object (
[intro.object]) is unspecified
. [
Note 3:
A derived class and its base class subobjects can be represented by a
directed acyclic graph (DAG) where an arrow means “directly derived
from” (see Figure
3)
. An arrow need not have a physical representation in memory
. A DAG of subobjects is often referred to as a “subobject lattice”
. —
end note]
[
Note 4:
Initialization of objects representing base classes can be specified in
constructors; see
[class.base.init]. —
end note]
[
Note 5:
A base class subobject can have a layout different
from the layout of a most derived object of the same type
. A base class
subobject can have a polymorphic behavior (
[class.cdtor])
different from the polymorphic behavior of a most derived object of the
same type
. A base class subobject can be of zero size;
however, two subobjects that have the same class type and that belong to
the same most derived object cannot be allocated at the same
address (
[intro.object])
. —
end note]