При переопределении класса в C ++ (с помощью виртуального деструктора) я снова реализую деструктор как виртуальный в классе наследования, но нужно ли вызывать базовый деструктор?
Если так, я представляю, что-то вроде этого ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Я прав?
c++
destructor
Ник Болтон
источник
источник
delete
указателя на базовый класс вызывает ошибку сегментации?Нет, вам не нужно вызывать базовый деструктор, базовый деструктор всегда вызывается для вас производным деструктором. Пожалуйста, смотрите мой соответствующий ответ здесь для порядка уничтожения .
Чтобы понять, зачем вам нужен виртуальный деструктор в базовом классе, посмотрите код ниже:
Когда вы делаете:
Тогда, если у вас нет виртуального деструктора в B, будет вызван только ~ B (). Но поскольку у вас есть виртуальный деструктор, сначала будет вызвана ~ D (), а затем ~ B ().
источник
То, что сказали другие, но также обратите внимание, что вам не нужно объявлять виртуальный деструктор в производном классе. Как только вы объявите виртуальный деструктор, как в базовом классе, все производные деструкторы будут виртуальными, независимо от того, объявите вы их так или нет. Другими словами:
источник
Нет. В отличие от других виртуальных методов, где вы явно вызываете метод Base из Derived для «цепочки» вызова, компилятор генерирует код для вызова деструкторов в обратном порядке, в котором были вызваны их конструкторы.
источник
Нет, вы никогда не вызываете деструктор базового класса, он всегда вызывается автоматически, как указали другие, но вот подтверждение концепции с результатами:
Выход:
Если вы установите деструктор базового класса как виртуальный, что следует сделать, то результаты для случая 3 будут такими же, как и для случаев 1 и 2.
источник
Нет, он автоматически вызывается.
источник
Деструкторы в C ++ автоматически вызываются в порядке их конструирования (Derived затем Base) только при объявлении деструктора базового класса
virtual
.Если нет, то только деструктор базового класса вызывается во время удаления объекта.
Пример: без виртуального деструктора
Вывод
Пример: с базовым виртуальным деструктором
Вывод
Рекомендуется объявить деструктор базового класса, так как в
virtual
противном случае он вызывает неопределенное поведение.Ссылка: виртуальный деструктор
источник