Рубрики

Виртуальный деструктор

Удаление объекта производного класса с использованием указателя на базовый класс с не виртуальным деструктором приводит к неопределенному поведению. Чтобы исправить эту ситуацию, базовый класс должен быть определен с помощью виртуального деструктора. Например, следующая программа приводит к неопределенному поведению.

// Программа CPP без виртуального деструктора
// вызывая неопределенное поведение
#include<iostream>

  

using namespace std;

  

class base {

  public:

    base()     

    { cout<<"Constructing base \n"; }

    ~base()

    { cout<<"Destructing base \n"; }     

};

  

class derived: public base {

  public:

    derived()     

    { cout<<"Constructing derived \n"; }

    ~derived()

    { cout<<"Destructing derived \n"; }

};

  

int main(void)

{

  derived *d = new derived();  

  base *b = d;

  delete b;

  getchar();

  return 0;

}

Хотя выходные данные следующей программы могут отличаться на разных компиляторах, при компиляции с использованием Dev-CPP она печатает следующее:

Constructing base
Constructing derived
Destructing base

Создание виртуального деструктора базового класса гарантирует, что объект производного класса будет уничтожен должным образом, т. Е. Как деструкторы базового класса, так и производного класса вызываются. Например,

// Программа с виртуальным деструктором
#include<iostream>

  

using namespace std;

  

class base {

  public:

    base()     

    { cout<<"Constructing base \n"; }

    virtual ~base()

    { cout<<"Destructing base \n"; }     

};

  

class derived: public base {

  public:

    derived()     

    { cout<<"Constructing derived \n"; }

    ~derived()

    { cout<<"Destructing derived \n"; }

};

  

int main(void)

{

  derived *d = new derived();  

  base *b = d;

  delete b;

  getchar();

  return 0;

}

Выход:

Constructing base
Constructing derived
Destructing derived
Destructing base

Как правило, всякий раз, когда у вас есть виртуальная функция в классе, вы должны немедленно добавить виртуальный деструктор (даже если он ничего не делает). Таким образом, вы гарантируете от любых неожиданностей позже.

Ссылка: Безопасное кодирование
Эта статья предоставлена Рахул Гупта . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Виртуальный деструктор

0.00 (0%) 0 votes