Вы хотите, чтобы они были виртуальными, чтобы все деструкторы подкласса автоматически вызывались при уничтожении объекта, даже если он уничтожается через указатель на базовый класс. В следующем коде:
class base {
public:
virtual ~base() { }
};
class derived : public base {
public:
~derived() { } // Inherits the virtual designation
};
int main(void)
{
base *b = new derived;
delete b;
}
Производный деструктор будет вызываться только , если базовый деструктор является виртуальным.
Как указывает Магнус, вам не обязательно делать это, если вы не пользуетесь полиморфизмом. Тем не менее, я пытаюсь выработать привычку объявлять все мои деструкторы виртуальными. Это защищает меня от случая, когда я должен был объявить их виртуальными, но забыть сделать это. Как указывает Йоханнес, эта привычка может налагать небольшое пространство и снижать производительность, когда виртуальное обозначение не требуется.