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

Конструктор класса не может быть виртуальным, ибо при создании объекта тип этого объекта должен быть заранее известен компилятору. С деструктором ситуация иная: оператор delete при разрушении объекта производного класса, объявленного с помощью указателя на базовый класс, будет вызывать деструктор базового класса. В результате объект производного класса будет разрушаться некорректно.

Деструкторы базовых классов вызываются после деструкторов производных классов.

Виртуальные деструкторы базовых классов вызываются прямо или косвенно любыми деструкторами производных классов.

Пример. Рассмотрим следующую программу, в которой виртуальный деструктор базового класса будет переопределён деструктором производного класса.

#include <iostream.h>

#include <conio.h>

class integral

      {

            int num;

      public:

            integral(int n):num(n) {}

            virtual ~integral()

                  {

                  cout << "Inside integraln";

                  }

      };

class rational: public integral

      {

            int den;

      public:

            rational(int n,int d): integral(n), den(d) {}

            ~rational()

                  {

                  cout << "Inside rationaln";

                  }

      };

rational obj(13,5);

int main()

      {

      clrscr();

      integral *ref = &obj;

      ref->integral::~integral();

      return 0;

      }

В этом примере при явном вызове деструктора сначала будет выполнен деструктор производного класса, а потом – деструктор базового класса.

В результате работы программы на экран будет выведено:

     Inside integral

      Inside rational

      Inside integral

Если же сделать деструктор базового класса невиртуальным, то сработает только деструктор базового класса.