Virtual Destructors
Go Up to Destructors Index
A destructor can be declared as virtual. This allows a pointer to a base class object to call the correct destructor in the event that the pointer actually refers to a derived class object. The destructor of a class derived from a class with a virtual destructor is itself virtual.
/* How virtual affects the order of destructor calls. Without a virtual destructor in the base class, the derived class destructor won't be called. */ #include <iostream> class color { public: virtual ~color() { // Virtual destructor std::cout << "color dtor\n"; } }; class red : public color { public: ~red() { // This destructor is also virtual std::cout << "red dtor\n"; } }; class brightred : public red { public: ~brightred() { // This destructor is also virtual std::cout << "brightred dtor\n"; } }; int main() { color *palette[3]; palette[0] = new red; palette[1] = new brightred; palette[2] = new color; // The destructors for red and color are called. delete palette[0]; std::cout << std::endl; // The destructors for bright red, red, and color are called. delete palette[1]; std::cout << std::endl; // The destructor for color is called. delete palette[2]; return 0; }
Program Output:
red dtor color dtor brightred dtor red dtor color dtor color dtor
However, if no destructors are declared as virtual, delete palette[0], delete palette[1], and delete palette[2] would all call only the destructor for class color. This would incorrectly destruct the first two elements, which were actually of type red and brightred.