3.9.1 Type Extensions
Every 
type extension is a tagged type, and is a 
record extension or 
a 
private extension of some other tagged type, or a non-interface 
synchronized tagged type.. 
 
Syntax
Legality Rules
The parent type of a record extension shall not be 
a class-wide type nor shall it be a synchronized tagged type (see 
3.9.4). 
If the parent type or any progenitor is nonlimited, then each of the 
components of the 
record_extension_part 
shall be nonlimited. 
In addition to the places where 
Legality Rules normally apply (see 
12.3), 
these rules apply also in the private part of an instance of a generic 
unit. 
 
Within the body of a generic unit, or the body of 
any of its descendant library units, a tagged type shall not be declared 
as a descendant of a formal type declared within the formal part of the 
generic unit.
Static Semantics
Dynamic Semantics
68  The term “type extension” 
refers to a type as a whole. The term “extension part” refers 
to the piece of text that defines the additional components (if any) 
the type extension has relative to its specified ancestor type. 
69  When an extension is declared immediately 
within a body, primitive subprograms are inherited and are overridable, 
but new primitive subprograms cannot be added.
71  Each visible component of a record extension 
has to have a unique name, whether the component is (visibly) inherited 
from the parent type or declared in the 
record_extension_part 
(see 
8.3). 
 
Examples
Examples of record 
extensions (of types defined above in 3.9): 
 
type Painted_Point is new Point with
  record
    Paint : Color := White;
  end record;
    -- Components X and Y are inherited
Origin : constant Painted_Point := (X | Y => 0.0, Paint => Black);
type Literal is new Expression with
  record                 -- a leaf in an Expression tree
    Value : Real;
  end record;
type Expr_Ptr 
is access all Expression'Class;
                               --
 see 3.10 
type Binary_Operation is new Expression with
  record                 -- an internal node in an Expression tree
    Left, Right : Expr_Ptr;
  end record;
type Addition is new Binary_Operation with null record;
type Subtraction is new Binary_Operation with null record;
  -- No additional components needed for these extensions
Tree : Expr_Ptr :=         -- A tree representation of “5.0 + (13.0–7.0)”
   new Addition'(
      Left  => new Literal'(Value => 5.0),
      Right => new Subtraction'(
         Left  => new Literal'(Value => 13.0),
         Right => new Literal'(Value => 7.0)));