13.9. Virtual Destructors
A problem can occur when using
polymorphism to process dynamically allocated objects of a class hierarchy. So
far you have seen nonvirtual destructors—destructors that are not declared with keyword
virtual. If a derived-class object with a
nonvirtual destructor is destroyed explicitly by applying the delete operator to a base-class pointer to the object, the C++
standard specifies that the behavior is undefined.
The simple solution to this problem is to
create a virtual destructor (i.e., a destructor that is declared
with keyword virtual) in the base class. This makes all derived-class
destructors virtual even
though they do not have the same name as the base-class destructor. Now, if an object in the hierarchy is
destroyed explicitly by applying the delete operator to a base-class pointer, the destructor for
the appropriate class is called based on the object to which the base-class
pointer points. Remember, when a derived-class object is destroyed, the
base-class part of the derived-class object is also destroyed, so it is
important for the destructors of both the derived class and base class
to execute. The base-class destructor automatically executes after the
derived-class destructor.
Error-Prevention Tip 13.2
|
If a class has
virtual functions, provide a virtual
destructor, even if one is not required for the class. This ensures that a
custom derived-class destructor (if there is one) will be invoked when a
derived-class object is deleted via a base class
pointer. |
Common Programming Error 13.5
|
Constructors cannot be
virtual. Declaring a constructor virtual is a compilation
error. |