Table of Contents

C++ Virtual destructor

Virtual destructor is required in base classes meant for polymorphic use. When deleting a derived object through a base pointer, a non-virtual destructor calls only the base destructor, leaving derived cleanup code unrun and causing resource leaks.

Always declare destructors virtual in base classes, or make the class final if inheritance isn't intended.

Example

This example shows how a virtual destructor ensures derived cleanup runs correctly.

// compile: g++ -o vdtor vdtor.cpp
// run: ./vdtor
// description: virtual destructor ensures derived cleanup in polymorphic code
 
#include <iostream>
 
class Base {
public:
    virtual ~Base() { std::cout << "Base destroyed\n"; }
};
 
class Derived : public Base {
private:
    int* data = new int[1000];
public:
    ~Derived() {
        delete[] data;
        std::cout << "Derived destroyed\n";
    }
};
 
int main() {
    {
        Base* ptr = new Derived();
        delete ptr;  // virtual destructor calls Derived::~Derived()
    }
 
    return 0;
}