Виртуальный деструктор в производном классе необходим для правильного вызова производного деструктора (полиморфизм), когда производный объект создается с помощью указателя на базовый класс.
Правило CPP High Integrity 3.3.2 Напишите «виртуальный» деструктор для базовых классов. (QACPP 2116)
Обоснование : Если объект когда-либо будет уничтожен через указатель на его базовый класс, то этот базовый класс должен иметь виртуальный деструктор. Если деструктор базового класса не является виртуальным, будет вызван только деструктор для базового класса. В большинстве случаев деструкторы должны быть виртуальными, поскольку при обслуживании или повторном использовании могут добавляться производные классы, для которых требуется виртуальный деструктор.
class Base {};
class Derived : public Base { public: ~Derived() {} };
void foo() {
Derived* d = new Derived; delete d; // correctly calls derived destructor
}
void boo() {
Derived* d = new Derived; Base* b = d; delete b; // problem! does not call derived destructor!
}