13.11. Wrap-Up
In this chapter we discussed
polymorphism, which enables us to "program in the general" rather than "program
in the specific," and we showed how this makes programs more extensible. We
began with an example of how polymorphism would allow a screen manager to
display several "space" objects. We then demonstrated how base-class and
derived-class pointers can be aimed at base-class and derived-class objects. We
said that aiming base-class pointers at base-class objects is natural, as is
aiming derived-class pointers at derived-class objects. Aiming base-class
pointers at derived-class objects is also natural because a derived-class object
is an object of its base
class. You learned why aiming derived-class pointers at base-class objects is
dangerous and why the compiler disallows such assignments. We introduced
virtual functions, which enable the
proper functions to be called when objects at various levels of an inheritance
hierarchy are referenced (at execution time) via base-class pointers. This is
known as dynamic or late binding. We then discussed pure virtual
functions (virtual functions that do not provide
an implementation) and abstract classes (classes with one or more pure
virtual functions). You learned that
abstract classes cannot be used to instantiate objects, while concrete classes
can. We then demonstrated using abstract classes in an inheritance hierarchy.
You learned how polymorphism works "under the hood" with vtables that are created by
the compiler. We discussed downcasting base-class pointers to derived-class
pointers to enable a program to call derived-class-only member functions. The
chapter concluded with a discussion of virtual destructors, and how they ensure
that all appropriate destructors in an inheritance hierarchy run on a
derived-class object when that object is deleted via a base-class pointer.
In the next chapter, we discuss
templates, a sophisticated feature of C++ that enables programmers to define a
family of related classes or functions with a single code segment.