1

Читаю одну книжку и столкнулся с таким кодом:

class Command
{
public:
  virtual ~Command() {}
  virtual void execute(GameActor& actor) = 0;
};

Объясните для чего нужен виртуальный деструктор? Если я его не напишу, то будут какие-то проблемы?

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
pank
  • 2,548

1 Answers1

2

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

#include <iostream>

using namespace std;

struct Base
{
   Base() { cout <<  "Base()" << endl; }
   ~Base(){ cout << "~Base()" << endl; }
};

struct Derived: public Base
{
   Derived() { cout <<  "Derived()" << endl; }
   ~Derived(){ cout << "~Derived()" << endl; }
};

int main()
{
   Base* obj = new Derived();
   delete obj;
}

Что вы могли ожидать на выходе:

Base()
Derived()
~Derived()
~Base()

Что может произойти (может, потому что, в общем случае, это undefined behaviour):

Base()
Derived()
~Base()

Для устранения данной проблемы необходимо деструктор класса родителя объявить виртуальным (virtual ~Base()), что позволит компилятору добраться до деструктора наследника по таблице виртуальных функций.