Рубрики

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

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

#include <iostream>

class Base

{

public:

    virtual ~Base()=0; // Чистый виртуальный деструктор

};

  

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): 
undefined reference to `Base::~Base()' 

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

#include <iostream>

class Base

{

public:

    virtual ~Base()=0; // Чистый виртуальный деструктор

};
Base::~Base()
{

    std::cout << "Pure virtual destructor is called";

}

  

class Derived : public Base

{

public:

    ~Derived()

    {

        std::cout << "~Derived() is executed\n";

    }

};

  

int main()

{

    Base *b = new Derived();

    delete b;

    return 0;

}

Выход:

~Derived() is executed
Pure virtual destructor is called

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

#include <iostream>

class Test

{

public:

    virtual ~Test()=0; // Test теперь становится абстрактным классом

};
Test::~Test() { }

  

int main()

{

    Test p;

    Test* t1 = new Test;

    return 0;

}

Приведенная выше программа завершается неудачно при компиляции и показывает следующие сообщения об ошибках.
[Ошибка] не может объявить переменную 'p' абстрактного типа '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 ++

0.00 (0%) 0 votes