Я прочитал книгу «Эффективный C++» Скотта Мейерса некоторое время назад, когда начал разработку движка. Я многому научился из этой книги. Как и все в жизни, если вы не учите тому, чему научились, вы это забудете. Поэтому я решаю перечитать книгу «Эффективный C++» и поделиться тем, что я узнал.

Давайте начнем:

Совет: всегда объявляйте виртуальный деструктор тогда и только тогда, когда у вас также есть хотя бы один виртуальный метод.

Если у вас есть виртуальные функции в базовом классе, обязательно объявите деструктор базы виртуальным.

Например, в листинге 1 показан базовый класс с виртуальным методом и невиртуальным деструктором.

Листинг 1.

class Animal{
virtual void run(); //virtual method
~Animal();  //non-virtual destructor
}

Теперь предположим, что у вас есть производный класс Animal под названием Monkey с измененным методом запуска. Что произойдет в тот момент, когда вы удалите экземпляр Monkey?

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

Простое решение этой проблемы — сделать деструктор в базовом классе виртуальным, как показано в листинге 2.

Листинг 2.

class Animal{
virtual void run(); //virtual method
virtual ~Animal();  //virtual destructor
}

Как насчет того, когда вы имеете дело с абстрактными классами? Если вы помните, абстрактные классы содержат чистые виртуальные методы. Более того, абстрактные классы не могут быть созданы. При работе с абстрактными классами также объявляйте деструктор как чисто виртуальный метод. Это показано в листинге 3.

Листинг 3.

class Animal{
virtual void run()=0; //Pure Virtual method
virtual ~Animal()=0;  //Pure Virtual destructor
}

Помните, чистый виртуальный деструктор в абстрактном классе должен предоставлять определение. Это показано в листинге 4.

Листинг 4.

Animal::~Animal(){};  //Pure Virtual destructor definition

Итак, если у вас есть полиморфный базовый класс, обязательно объявите его деструктор виртуальным.

Узнайте больше на haroldserrano.com