Some class hierarchies are broad but have many things in common. The common code is implemented in a base class, whereas the specific code is in the derived classes.
It is important for the base classes to establish a protocol through which the derived classes can attain maximum functionality. These protocols are commonly implemented using virtual functions. Sometimes the base class provides a default implementation for such functions. In a class hierarchy such as the Document
hierarchy in Figure 9.2, two useful functions are Identify
and WhereIs
.
When called, the Identify
function returns a correct identification, appropriate to the kind of document: For a Book
, a function call such as doc->Identify()
must return the ISBN number; however, for a HelpFile
, a product name and revision number are probably more appropriate. Similarly, WhereIs
should return a row and shelf for a Book
, but for a HelpFile
it should return a disk location — perhaps a directory and filename.
It is important that all implementations of the Identify
and WhereIs
functions return the same kind of information. In this case, a character string is appropriate.
These functions are implemented as virtual functions and then invoked using a pointer to a base class. The binding to the actual code occurs at run time, selecting the correct Identify
or WhereIs
function.