При удалении объекта базового класса через указатель на базовый класс, который фактически указывает на объект производного класса, виртуальный деструктор гарантирует вызов деструктора производного класса перед вызовом деструктора базового класса. Это необходимо для корректного освобождения ресурсов, выделенных производным классом. Если деструктор базового класса не виртуальный, будет вызван только деструктор базового класса, что приведет к утечке ресурсов.
c
Без виртуального деструктора вывод был бы таким:
plaintext
При наличии виртуального деструктора вывод:
plaintext