[class.derived.general]

# 11 Classes [[class]](./#class)

## 11.7 Derived classes [[class.derived]](class.derived#general)

### 11.7.1 General [class.derived.general]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3511)

A list of base classes can be specified in a class definition using
the notation:

[base-clause:](#nt:base-clause "11.7.1 General [class.derived.general]")  
: [*base-specifier-list*](#nt:base-specifier-list "11.7.1 General [class.derived.general]")

[base-specifier-list:](#nt:base-specifier-list "11.7.1 General [class.derived.general]")  
[*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]") ...opt  
[*base-specifier-list*](#nt:base-specifier-list "11.7.1 General [class.derived.general]") , [*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]") ...opt

[base-specifier:](#nt:base-specifier "11.7.1 General [class.derived.general]")  
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]")  
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt virtual [*access-specifier*](#nt:access-specifier "11.7.1 General [class.derived.general]")opt [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]")  
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*access-specifier*](#nt:access-specifier "11.7.1 General [class.derived.general]") virtualopt [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]")

[class-or-decltype:](#nt:class-or-decltype "11.7.1 General [class.derived.general]")  
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*type-name*](dcl.type.simple#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") template [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]")  
[*computed-type-specifier*](dcl.type.simple#nt:computed-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")

[access-specifier:](#nt:access-specifier "11.7.1 General [class.derived.general]")  
private  
protected  
public

The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") appertains to the [*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]")[.](#1.sentence-2)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3554)

The component names of a [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]") are those of its[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]"),[*type-name*](dcl.type.simple#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]"), and/or[*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]")[.](#2.sentence-1)

A [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]") shall denote
a (possibly cv-qualified) class type that is not
an incompletely defined class ([[class.mem]](class.mem "11.4 Class members"));
any cv-qualifiers are ignored[.](#2.sentence-2)

The class denoted by the [*class-or-decltype*](#nt:class-or-decltype "11.7.1 General [class.derived.general]") of
a [*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]") is called a[*direct base class*](#def:base_class,direct "11.7.1 General [class.derived.general]") for the class being defined;
for each such [*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]"),
the corresponding [*direct base class relationship*](#def:relationship,direct_base_class "11.7.1 General [class.derived.general]") is the ordered pair (D, B)
where D is the class being defined andB is the direct base class[.](#2.sentence-3)

The lookup for the component name of
the [*type-name*](dcl.type.simple#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]") or [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]") is type-only ([[basic.lookup]](basic.lookup "6.5 Name lookup"))[.](#2.sentence-4)

A class B is a
base class of a class D if it is a direct base class ofD or a direct base class of one of D's base classes[.](#2.sentence-5)

A class is an [*indirect base class*](#def:base_class,indirect "11.7.1 General [class.derived.general]") of another if it is a base
class but not a direct base class[.](#2.sentence-6)

A class is said to be (directly or
indirectly) [*derived*](#def:derived) from its (direct or indirect) base
classes[.](#2.sentence-7)

[*Note [1](#note-1)*:

See [[class.access]](class.access "11.8 Member access control") for the meaning of[*access-specifier*](#nt:access-specifier "11.7.1 General [class.derived.general]")[.](#2.sentence-8)

â *end note*]

Members of a base class are also members of the derived class[.](#2.sentence-9)

[*Note [2](#note-2)*:

Constructors of a base class can be explicitly inherited ([[namespace.udecl]](namespace.udecl "9.10 The using declaration"))[.](#2.sentence-10)

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]](class.member.lookup "6.5.2 Member name lookup"))[.](#2.sentence-11)

The scope resolution operator ​::​ ([[expr.prim.id.qual]](expr.prim.id.qual "7.5.5.3 Qualified names")) can be used
to refer to a direct or indirect base member explicitly,
even if it is hidden in the derived class[.](#2.sentence-12)

A derived class can itself serve as a base class subject to access
control; see [[class.access.base]](class.access.base "11.8.3 Accessibility of base classes and base class members")[.](#2.sentence-13)

A pointer to a derived class can be
implicitly converted to a pointer to an accessible unambiguous base
class ([[conv.ptr]](conv.ptr "7.3.12 Pointer conversions"))[.](#2.sentence-14)

An lvalue of a derived class type can be bound
to a reference to an accessible unambiguous base
class ([[dcl.init.ref]](dcl.init.ref "9.5.4 References"))[.](#2.sentence-15)

â *end note*]

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3609)

The [*base-specifier-list*](#nt:base-specifier-list "11.7.1 General [class.derived.general]") specifies the type of the[*base class subobjects*](#def:base_class_subobjects) contained in an
object of the derived class type[.](#3.sentence-1)

[*Example [1](#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 classDerived which in turn will have a subobject of classBase[.](#3.sentence-2)

â *end example*]

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3637)

A [*base-specifier*](#nt:base-specifier "11.7.1 General [class.derived.general]") followed by an ellipsis is a pack
expansion ([[temp.variadic]](temp.variadic "13.7.4 Variadic templates"))[.](#4.sentence-1)

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3641)

The order in which the base class subobjects are allocated in the most
derived object ([[intro.object]](intro.object "6.8.2 Object model")) is unspecified[.](#5.sentence-1)

[*Note [3](#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](#fig:class.dag))[.](#5.sentence-2)

An arrow need not have a physical representation in memory[.](#5.sentence-3)

A DAG of subobjects is often referred to as a âsubobject latticeâ[.](#5.sentence-4)

â *end note*]

![SVG Image](data:image/svg+xml;base64, )  
Figure [3](#fig:class.dag) — Directed acyclic graph [[fig:class.dag]](./fig:class.dag)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3661)

[*Note [4](#note-4)*:

Initialization of objects representing base classes can be specified in
constructors; see [[class.base.init]](class.base.init "11.9.3 Initializing bases and members")[.](#6.sentence-1)

â *end note*]

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L3667)

[*Note [5](#note-5)*:

A base class subobject can have a layout different
from the layout of a most derived object of the same type[.](#7.sentence-1)

A base class
subobject can have a polymorphic behavior ([[class.cdtor]](class.cdtor "11.9.5 Construction and destruction"))
different from the polymorphic behavior of a most derived object of the
same type[.](#7.sentence-2)

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]](intro.object "6.8.2 Object model"))[.](#7.sentence-3)

â *end note*]
