Чистый виртуальный деструктор в C ++

Опубликовано: 1 Января, 2022

Может ли деструктор быть чисто виртуальным в C ++?
Да, возможен чистый виртуальный деструктор. Чистые виртуальные деструкторы допустимы в стандартном C ++, и одна из самых важных вещей, о которых следует помнить, заключается в том, что если класс содержит чистый виртуальный деструктор, он должен предоставлять тело функции для чистого виртуального деструктора. Вам может быть интересно, почему чистой виртуальной функции требуется тело функции. Причина в том, что деструкторы (в отличие от других функций) на самом деле не «переопределяются», а всегда вызываются в порядке, обратном порядку создания класса. Это означает, что сначала будет вызван деструктор производного класса, затем будет вызван деструктор базового класса. Если определение чистого виртуального деструктора не предусмотрено, то какое тело функции будет вызываться при уничтожении объекта? Поэтому компилятор и компоновщик обеспечивают существование тела функции для чистых виртуальных деструкторов.
Рассмотрим следующую программу:

#include <iostream>
class Base
{
public :
virtual ~Base()=0; // Pure virtual destructor
};
class Derived : public Base
{
public :
~Derived()
{
std::cout << "~Derived() is executed" ;
}
};
int main()
{
Base *b= new Derived();
delete b;
return 0;
}

Компоновщик выдаст следующую ошибку в указанной выше программе.

test.cpp :(. text $ _ZN7DerivedD1Ev [__ ZN7DerivedD1Ev] + 0x4c): 
неопределенная ссылка на `Base :: ~ Base () '

Теперь, если дано определение чистого виртуального деструктора, программа компилируется и работает нормально.

#include <iostream>
class Base
{
public :
virtual ~Base()=0; // Pure virtual destructor
};
Base::~Base()
{
std::cout << "Pure virtual destructor is called" ;
}
class Derived : public Base
{
public :
~Derived()
{
std::cout << "~Derived() is executed " ;
}
};
int main()
{
Base *b = new Derived();
delete b;
return 0;
}

Выход:

 ~ Derived () выполняется
Чистый виртуальный деструктор называется

Важно отметить, что класс становится абстрактным, если он содержит чистый виртуальный деструктор. Например, попробуйте скомпилировать следующую программу.

Вышеупомянутая программа не компилируется и показывает следующие сообщения об ошибках.
[Ошибка] не может объявить переменную 'p' абстрактным типом 'Test'
[Примечание], потому что следующие виртуальные функции являются чистыми внутри Test:
[Примечание] virtual Test :: ~ Test ()
[Ошибка] не удается выделить объект абстрактного типа "Тест"
[Примечание], поскольку тип 'Test' имеет чисто виртуальные функции

Статьи по Теме :
Конструкторы в C ++
Деструкторы в C ++
Виртуальный деструктор

Источники:
http://www.bogotobogo.com/cplusplus/virtualfunctions.php
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

Эта статья была предоставлена Meet Pravasi . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++ C