Я прочитал книгу «Эффективный 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