Деструктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).
Практически всегда деструктор делается виртуальным.
 Делается это для того, чтобы корректно (без утечек памяти) уничтожались
 объекты не только заданного класса, а и любого производного от него. 
Например: в игре уровни, звуки и спрайты могут создаваться загрузчиком, а
 уничтожаться — менеджером памяти, для которого нет разницы между 
уровнем и спрайтом.
Пусть (на C++) есть тип Father и порождённый от него тип Son:
class Father
{
public:
 Father() {}
 ~Father() {} 
};
 
class Son : public Father
{
public:
 int* buffer;
 Son() : Father() { buffer = new int[1024]; }
 ~Son() { delete[] buffer; }
};
Нижеприведённый код является некорректным и приводит к утечке памяти.
Father* object = new Son();   // вызывается Son()
delete object;                // вызывается ~Father()!!
Однако, если сделать деструктор Father виртуальным:
class Father
{
public:
 Father() {}
 virtual ~Father() {} 
};
 
class Son : public Father
{
private:
 int* buffer;
public:
 Son() : Father() { buffer = new int[1024]; }
 ~Son() { delete[] buffer; }
};
вызов delete object; приведет в последовательному вызову деструкторов ~Son и ~Father.
В
 Delphi все классы порождаются от TObject, деструктор которого является 
виртуальным, поэтому нет необходимости самому объявлять деструкторы 
любых объектов виртуальными.


