::: ''This task is about derived types; for implementation inheritance, see [[Polymorphism]].
Inheritance is an operation of [[type algebra]] that creates a new type from one or several parent types.
The obtained type is called '''derived type'''.
It inherits some of the properties of its parent types.
Usually inherited properties are:
:::* methods
:::* components
:::* parts of the representation
The [[classes | class]] of the new type is a '''subclass''' of the classes rooted in the parent types.
When all (in certain sense) properties of the parents are preserved by the derived type, it is said to be a [[wp:Liskov_substitution_principle|Liskov subtype]].
When properties are preserved then the derived type is ''substitutable'' for its parents in all contexts. Usually full substitutability is achievable only in some contexts.
Inheritance is
:::* '''single''', when only one parent is allowed
:::* '''[[multiple inheritance | multiple]]''', otherwise
Some single inheritance languages usually allow multiple inheritance for certain [[abstract type]]s, interfaces in particular.
Inheritance can be considered as a relation parent-child.
Parent types are sometimes called '''supertype''', the derived ones are '''subtype'''. This relation is [[wp:Transitive_relation|transitive]] and [[wp:Reflexive_relation|reflexive]].
Types bound by the relation form a [[wp:Directed_acyclic_graph directed acyclic graph]] (ignoring reflexivity).
With single inheritance it becomes a [[wp:Tree_(graph_theory)|tree]].
;Task:
Show a tree of types which inherit from each other.
::: At the top of the tree should be a class called '''Animal'''.
::: The second level should have '''Dog''' and '''Cat'''.
::: Under '''Dog''' should be '''Lab''' and '''Collie'''.
::: None of the classes need to have any functions, the only thing they need to do is inherit from the specified superclasses
(overriding functions should be shown in [[Polymorphism]]).
The tree should look like this:
Animal
/\
/ \
/ \
Dog Cat
/\
/ \
/ \
Lab Collie