Object-oriented programming is particularly useful for reducing problems of complexity associated with the writing of large scale software packages. It is useful to think of a typical complex system as consisting of two orthogonal planes of hierarchy  (See Figure 2.1).
Figure 2.1: The Problem of Complexity
The first plane consists of a set of classes, each of which acts as a ``blueprint'' for the instantiation of objects. This plane contains a hierarchy known as the ``is a kind of'' relationship. Any class, D, in the plane which points to another class, B, is said to be a kind of class B. All the properties of class B (commonly called a base class) are passed down to class D (referred to as a derived class). As can be seen from the diagram, a derived class can be used as the base class of another; and a class can be specified as being ``a kind of'' two or more classes. This ``is a kind of'' hierarchy is supported in object-oriented languages through the mechanism of inheritance which will be discussed in detail later.
The second plane consists of a series of objects which, as mentioned above, are instantiated from the classes of the first plane. This hierarchy is called the ``is a part of'' relationship and is achieved through the encapsulation, or aggregation, of classes. The hierarchy suggests that one object may be comprised of several objects; each of which can be made up of even more objects.
Examples of these two types of hierarchies will be discussed later when we attempt to describe hardware using these relationships.