Это не только хорошая практика. Это правило № 1 для любой иерархии классов.
- Самый базовый класс иерархии в C ++ должен иметь виртуальный деструктор
Теперь, почему. Возьмите типичную иерархию животных. Виртуальные деструкторы проходят виртуальную диспетчеризацию, как и любой другой вызов метода. Возьмите следующий пример.
Animal* pAnimal = GetAnimal();
delete pAnimal;
Предположим, что Animal является абстрактным классом. Единственный способ, которым C ++ знает правильный деструктор для вызова, - это диспетчеризация виртуального метода. Если деструктор не является виртуальным, он просто вызывает деструктор Animal и не уничтожает объекты в производных классах.
Причина создания виртуального деструктора в базовом классе заключается в том, что он просто удаляет выбор из производных классов. Их деструктор становится виртуальным по умолчанию.