![]() |
![]() |
![]() |
![]() |
![]() |
|
You might think that the deletion of a railroad car in the train array
would activate the appropriate engine, box car, tank car, or caboose
destructor. As usual, however, C++ ordinarily does not note whether the
objects in the train array, defined to be full of railroad_car
objects, belong to a more specific railroad-car type. To
force C++ to take into account
more specific type information, you must, once again, invoke the
virtual-function mechanism, this time on the destructor for the
railroad_car class, by placing the symbol virtual before the
destructor definition:
class railroad_car {
public: char *serial_number;
// Constructors:
railroad_car ( ) { }
railroad_car (char *input_buffer) {
// Create new array just long enough:
serial_number = new char[strlen(input_buffer) + 1];
// Copy string into new array:
strcpy (serial_number, input_buffer);
}
// Destructor:
virtual ~railroad_car ( ) {
cout << "Deleting a railroad serial number" << endl;
delete [ ] serial_number;
}
// Other:
virtual char* short_name ( ) {return "rrc";}
virtual double capacity ( ) {return 0.0;}
};
By making the railroad_car destructor virtual, you tell C++ to
treat all the lower-level destructors as virtual. Thus, a virtual
destructor exposes destructors in derived classes.