Читаю одну книжку и столкнулся с таким кодом:
class Command
{
public:
virtual ~Command() {}
virtual void execute(GameActor& actor) = 0;
};
Объясните для чего нужен виртуальный деструктор? Если я его не напишу, то будут какие-то проблемы?
Читаю одну книжку и столкнулся с таким кодом:
class Command
{
public:
virtual ~Command() {}
virtual void execute(GameActor& actor) = 0;
};
Объясните для чего нужен виртуальный деструктор? Если я его не напишу, то будут какие-то проблемы?
Виртуальный деструктор необходим, чтобы избежать возможной утечки ресурсов или другого неконтролируемого поведения объекта, в логику работы которого включен вызов деструктора.
#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()), что позволит компилятору добраться до деструктора наследника по таблице виртуальных функций.
undefined behaviour). – StateItPrimitive Mar 03 '16 at 18:54