Figure 11.1 lists several simple examples of base classes and derived classes. Base classes tend to be more general and derived classes tend to be more specific.
Base class | Derived classes |
---|---|
Student |
GraduateStudent , UndergraduateStudent |
Shape |
Circle , Triangle , Rectangle , Sphere , Cube |
Loan |
CarLoan , HomeImprovementLoan , MortgageLoan |
Employee |
Faculty , Staff |
Account |
CheckingAccount , SavingsAccount |
Because every derived-class object is an object of its base class, and one base class can have many derived classes, the set of objects represented by a base class typically is larger than the set of objects represented by any of its derived classes. For example, the base class Vehicle
represents all vehicles, including cars, trucks, boats, airplanes, bicycles and so on. By contrast, derived-class Car
represents a smaller, more specific subset of all vehicles.
Inheritance relationships form class hierarchies. A base class exists in a hierarchical relationship with its derived classes. Although classes can exist independently, once they’re employed in inheritance relationships, they become affiliated with other classes. A class becomes either a base class—supplying members to other classes, a derived class—inheriting its members from other classes, or both.
CommunityMember
Class HierarchyLet’s develop a simple inheritance hierarchy with five levels (represented by the UML class diagram in Fig. 11.2). A university community has thousands of CommunityMember
s. These CommunityMember
s consist of Employee
s, Student
s and alumni (each of class Alumnus
). Employee
s are either Faculty
or Staff
. Faculty
are either Administrator
s or Teacher
s. Some Administrator
s, however, are also Teacher
s. We’ve used multiple inheritance to form class AdministratorTeacher
. With single inheritance, a class is derived from one base class. With multiple inheritance, a derived class inherits simultaneously from two or more (possibly unrelated) base classes. We discuss multiple inheritance in Chapter 23, Other Topics.
Each arrow in the hierarchy (Fig. 11.2) represents an is-a relationship. For example, as we follow the arrows in this class hierarchy, we can state “an Employee
is a Community-Member
” and “a Teacher
is a Faculty
member.” CommunityMember
is the direct base class of Employee
, Student
and Alumnus
. In addition, CommunityMember
is an indirect base class of all the other classes in the diagram. An indirect base class is inherited from two or more levels up the class hierarchy.
Starting from the bottom of the diagram, you can follow the arrows upward and apply the is-a relationship to the topmost base class. For example, an AdministratorTeacher
is an Administrator
, is a Faculty
member, is an Employee
and is a CommunityMember
.
Now consider the Shape
inheritance hierarchy in Fig. 11.3. This hierarchy begins with base-class Shape
. Classes TwoDimensionalShape
and ThreeDimensionalShape
derive from base-class Shape
—a TwoDimensionalShape
is a Shape
and a ThreeDimensionalShape
is a Shape
. The third level of this hierarchy contains more specific types of TwoDimensionalShape
s and ThreeDimensionalShape
s. As in Fig. 11.2, we can follow the arrows from the bottom of the diagram upward to the topmost base class in this hierarchy to identify several is-a relationships. For instance, a Triangle
is a TwoDimensionalShape
and is a Shape
, while a Sphere
is a ThreeDimensionalShape
and is a Shape
.
To specify that class TwoDimensionalShape
(Fig. 11.3) is derived from (or inherits from) class Shape
, class TwoDimensionalShape
’s definition could begin as follows:
class TwoDimensionalShape : public Shape
This is an example of public
inheritance, the most commonly used form. We’ll also discuss private
inheritance and protected
inheritance (Section 11.5). With all forms of inheritance, private
members of a base class are not accessible directly from that class’s derived classes, but these private
base-class members are still inherited (i.e., they’re still considered parts of the derived classes). With public
inheritance, all other base-class members retain their original member access when they become members of the derived class (e.g., public
members of the base class become public
members of the derived class, and, as we’ll soon see, protected
members of the base class become protected
members of the derived class). Through inherited base-class member functions, the derived class can manipulate private
members of the base class (if these inherited member functions provide such functionality in the base class).
Inheritance is not appropriate for every class relationship. In some cases, the has-a relationship (composition) is more appropriate. For example, given the classes Employee
, BirthDate
and TelephoneNumber
, it’s improper to say that an Employee
is a BirthDate
or that an Employee
is a TelephoneNumber
. However, it is appropriate to say that an Employee
has a BirthDate
and that an Employee
has a TelephoneNumber
.
It’s possible to treat base-class objects and derived-class objects similarly; their commonalities are expressed in the members of the base class. In Chapter 12, we consider many examples that take advantage of this relationship.