This section reexamines the CommissionEmployee
–BasePlusCommissionEmployee
hierarchy that we explored throughout Section 11.3. In this example, we use an abstract class and polymorphism to perform payroll calculations based on the type of employee. We create an enhanced employee hierarchy to solve the following problem:
A company pays its employees weekly. The employees are of three types: Salaried employees are paid a fixed weekly salary regardless of the number of hours worked, commission employees are paid a percentage of their sales and base-salary-plus-commission employees receive a base salary plus a percentage of their sales. For the current pay period, the company has decided to reward base-salary-plus-commission employees by adding 10 percent to their base salaries. The company wants to implement a C++ program that performs its payroll calculations polymorphically.
We use abstract class Employee
to represent the general concept of an employee. The classes that derive directly from Employee
are SalariedEmployee
and CommissionEmployee
. Class BasePlusCommissionEmployee
—derived from CommissionEmployee
—represents the last employee type. The UML class diagram in Fig. 12.7 shows the inheritance hierarchy for our polymorphic employee payroll application. The abstract class name Employee
is italicized, as per the convention of the UML.
Abstract base class Employee
declares the “interface” to the hierarchy—that is, the set of member functions that a program can invoke on all Employee
objects. Each employee, regardless of the way his or her earnings are calculated, has a first name, a last name and a social security number, so private
data members firstName
, lastName
and socialSecurityNumber
appear in abstract base class Employee
.
Software Engineering Observation 12.11
A derived class can inherit interface and/or implementation from a base class. Hierarchies designed for implementation inheritance tend to have their functionality high in the hierarchy—each new derived class inherits one or more member functions that were defined in a base class, and the derived class uses the base-class definitions. Hierarchies designed for interface inheritance tend to have their functionality lower in the hierarchy—a base class specifies one or more functions that should be defined for each class in the hierarchy (i.e., they have the same prototype), but the individual derived classes provide their own implementations of the function(s).
The following sections implement the Employee
class hierarchy. The first five each implement one of the abstract or concrete classes. The last section implements a test program that builds objects of all these classes and processes the objects polymorphically.
3.145.179.59