Służy to tego samego, co zwykły destruktor, z tą różnicą, że dzięki "uwirtualnieniu" destruktora masz pewność, że podczas niszczenia obiektu klasy pochodnej z poziomu wskaźnika na klasę bazową zostanie wywołany destruktor klasy pochodnej.
Przykład:
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base()\n"; }
};
struct Derived : public Base {
~Derived() { std::cout << "~Derived()\n"; }
};
int main()
{
Base* p = new Derived;
delete p;
}
Zobacz, co się stanie, gdy usuniesz virtual.