Нет, все деструкторы по умолчанию НЕ являются виртуальными.
Вам потребуется определить виртуальный деструктор для всех базовых классов
В дополнение к этому.
Цитируя Скотта Мейерса в его книге "Эффективный C ++":
Стандарт языка C ++
необычно понятно по этой теме. когда
вы пытаетесь удалить производный класс
объект через указатель базового класса
и базовый класс имеет не виртуальный
деструктор (как EnemyTarget делает),
результаты не определены
На практике обычно хорошей идеей является определение класса с помощью виртуального деструктора, если вы думаете, что кто-то может в конечном итоге создать из него производный класс. В любом случае, я стараюсь сделать так, чтобы у всех классов были виртуальные деструкторы. Да, с этим связана определенная стоимость, но цена не частого ее виртуализации, а то, что он не израсходован, приводит к излишним затратам времени выполнения.
Я предлагаю сделать его не виртуальным, только когда вы абсолютно уверены, что хотите именно так, а не полагаться на не виртуальный по умолчанию, который обеспечивают компиляторы. Вы можете не согласиться, однако (в итоге) у меня недавно произошла ужасная утечка памяти в каком-то устаревшем коде, где все, что я делал, это добавлял std :: vector в один из классов, существовавших несколько лет. Оказывается, что в одном из его базовых классов не был определен деструктор (деструктор по умолчанию пустой, не виртуальный!), И, поскольку память не выделялась таким образом, до того, как до этой точки не просочилась память. Много дней исследований и время было потрачено впустую ...