Hierarchical inheritance

13.4 Hierarchical inheritance

Learning objectives

By the end of this section you should be able to

  • Label relationships between classes as types of inheritance.
  • Construct classes that form hierarchical inheritance.

Hierarchical inheritance basics

Hierarchical inheritance is a type of inheritance in which multiple classes inherit from a single superclass. Multilevel inheritance is a type of inheritance in which a subclass becomes the superclass for another class. Combining hierarchical and multilevel inheritance creates a tree-like organization of classes.

Checkpoint

Hierarchical organization and types of inheritance

Concepts in Practice

Hierarchical organization

1.
Which is an example of hierarchical inheritance?
  1. Class B inherits from Class A
    Class C inherits from Class A
  2. Class B inherits from Class A
    Class C inherits from Class B
  3. Class B inherits from Class A
    Class C inherits from Class D
2.
Which group of classes is hierarchical inheritance appropriate for?
  1. Cat, Dog, Bird
  2. Employee, Developer, SalesRep
  3. Dessert, BakedGood, ApplePie

Implementing hierarchical inheritance

Multiple classes can inherit from a single class by simply including the superclass name in each subclass definition.

Example 13.4

Choir members

    class ChoirMember:
      def display(self):
        print("Current choir member")

    class Soprano(ChoirMember):
      def display(self):
        super().display()
        print("Part: Soprano")

    class Soprano1(Soprano):
      def display(self):
        super().display()
        print("Division: Soprano 1")

    class Alto(ChoirMember):
      def display(self):
        super().display()
        print("Part: Alto")

    class Tenor(ChoirMember):
      def display(self):
        super().display()
        print("Part: Tenor")

    class Bass(ChoirMember):
      def display(self):
        super().display()
        print("Part: Bass")

    mem_10 = Alto()
    mem_13 = Tenor()
    mem_15 = Soprano1()

    mem_10.display()
    print()
    mem_13.display()
    print()
    mem_15.display()

The code's output is:

    Current choir member
    Part: Alto

    Current choir member
    Part: Tenor

    Current choir member
    Part: Soprano
    Division: Soprano 1

Concepts in Practice

Implementing hierarchical inheritance

Consider the program:

    class A:
      def __init__(self, a_attr=0):
        self.a_attr = a_attr

    class B(A):
      def __init__(self, a_attr=0, b_attr=0):
        super().__init__(a_attr)
        self.b_attr = b_attr

    class C(A):
      def __init__(self, a_attr=0, c_attr=0):
        super().__init__(a_attr)
        self.c_attr = c_attr

    class D(B):
      def __init__(self, a_attr=0, b_attr=0, d_attr=0):
        super().__init__(a_attr, b_attr)
        self.d_attr = d_attr
    
    b_inst = B(2)
    c_inst = C(c_attr=4)
    d_inst = D(6, 7)
3.
What is the value of b_inst.b_attr?
  1. 0
  2. 2
  3. Error
4.
Which attributes does c_inst have access to?
  1. a_attr
  2. a_attr, c_attr
  3. c_attr
5.
Which attributes does d_inst have access to?
  1. b_attr, d_attr
  2. a_attr, b_attr, d_attr
  3. d_attr

Try It

Overriding methods

Define three classes: Instrument, Woodwind, and String.

  • Instrument has instance attribute owner, with default value of "unknown".
  • Woodwind inherits from Instrument and has instance attribute material with default value of "wood".
  • String inherits from Instrument and has instance attribute num_strings, with default value of 4.

The output should match:

    This flute belongs to unknown and is made of silver
    This cello belongs to Bea and has 4 strings