Когда базовый класс используется для создания полиморфной иерархии классов (то есть, есть производные классы, и они могут быть доступны через указатель или ссылку на базовый класс), и при этом предполагается удаление объектов производных классов через указатель на базовый класс. Без виртуального деструктора вызов delete через указатель на базовый класс приведет к вызову деструктора только базового класса, что может вызвать утечки памяти или некорректное поведение, так как деструкторы производных классов не будут вызваны.
c
Если деструктор базового класса не объявлен как virtual, и объект производного класса удаляется через указатель на базовый класс, происходит неопределенное поведение (Undefined Behavior).
c
Кратко: объявляйте деструктор базового класса виртуальным, если вы планируете удалять объекты производных классов через указатель или ссылку на базовый класс. Если класс не предназначен для наследования или объекты не будут удаляться полиморфно, виртуальный деструктор не нужен и может вызвать небольшие накладные расходы.