Каков наилучший способ уничтожения производного класса? - PullRequest
0 голосов
/ 13 июля 2020

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

  1. Простой деструктор: ~Derived();
  2. Деструктор с переопределением: ~Derived() override;
  3. Деструктор по умолчанию с переопределить: ~Derived() override = default;
  4. Виртуальный деструктор: virtual ~Derived() override = default;

Также есть известная передовая практика?

1 Ответ

1 голос
/ 13 июля 2020

Primer: мы ожидаем, что Baseclass::~Baseclass будет виртуальным, а class Derived будет производным publi c из Baseclass.

  1. Simple Destructor: это то, что вы в основном будете использовать если нет (и никогда не будет) других классов, производных от Derived. Не объявляйте все деструкторы как виртуальные, а лучше используйте ключевое слово override, как описано в разделе 2. Исключение: вы создаете библиотеку сегментов и хотите, чтобы люди безопасно извлекали ie классы из вашей библиотеки.

  2. Деструктор с переопределением: если вы объявляете класс dervied и хотите вызвать его деструктор базового класса, используйте override. Таким образом, вы получите ошибку компиляции, если вы забыли добавить virtual в дескструктор базового класса.

  3. Деструктор с переопределением и деструктор по умолчанию: вы также получите ошибку компиляции, если вы забыли объявить деструктор базового класса виртуальным. Используйте это, если вам не нужно выполнять специальные задачи очистки (например, освобождение памяти, выделенной HEAP). Лучше / чище, чем писать ~Derived() {}

  4. Комбинация всего: Ну, нет никакой пользы в объявлении деструктора виртуальным, а также в использовании переопределения. Переопределение в любом случае объявит метод (в данном случае метод удаления) как виртуальный. См .: https://en.cppreference.com/w/cpp/language/override. Это то же самое, что и 3.

...