Init
This commit is contained in:
179
cppdraft/class/derived/general.md
Normal file
179
cppdraft/class/derived/general.md
Normal file
@@ -0,0 +1,179 @@
|
||||
[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*]
|
||||
|
||||

|
||||
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*]
|
||||
Reference in New Issue
Block a user