Some class hierarchies are broad but have many things in common. The common code is implemented in a base class, while 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 is 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, 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.