Существует this question на stackoverflow, который защищает правило Скотта Мейерса только за создание деструктора виртуального, если в этом классе есть виртуальные функции.Должен ли деструктор быть виртуальным, когда класс является частью более крупной структуры?
Я работаю в компании с большой каркасной платформой, и неясно время кодирования, если ваш класс может быть расширен в будущем. В этот момент также может быть невозможно изменить этот класс (поскольку он является частью выпущенного пакета).
Теперь представьте себе следующий сценарий:
class A {
public:
A();
virtual ~A();
virtual m();
};
class B : public A {
public:
B();
~B();
};
class C : public B {
public:
C();
virtual ~C();
virtual m();
};
Так что я создал class B
и сейчас, он не может быть изменен. Теперь class C
создается и используется в качестве B
:
B * b = new C();
delete b;
Что будет происходить в том, что деструктор C никогда не называется, не так ли?
В этом сценарии: Если класс всегда есть виртуальный деструктор?
Настоящий ответ - не злоупотреблять наследованием для расширения классов. Вместо этого используйте композицию. – nwp
С устаревшим кодом использование наследования часто является единственным способом исправить ошибки или поведение. Например, мой код будет использоваться повторно без возможности его изменения. – Pascal