Урок №173. Віртуальні деструктори і Віртуальне присвоювання

  Юрій  | 

  Оновл. 23 Бер 2021  | 

 97

Хоча мова C++ автоматично надає деструктори для ваших класів, якщо ви не надаєте їх самостійно, все ж іноді ви можете зробити це самі.

Віртуальні деструктори

При роботі зі спадкуванням ваші деструктори завжди повинні бути віртуальними. Розглянемо наступний приклад:

Оскільки parent є вказівником класу Parent, то при його знищенні компілятор буде дивитися, чи є деструктор класу Parent віртуальним. Оскільки це не так, то компілятор викличе тільки деструктор класу Parent.

Результат виконання програми:

Calling ~Parent()

Проте, нам потрібно, щоб delete викликав деструктор класу Child (який, в свою чергу, буде викликати деструктор класу Parent), інакше m_array не буде видалений. Це можна виконати, зробивши деструктор класу Parent віртуальним:

Результат виконання програми:

Calling ~Child()
Calling ~Parent()

Правило: При роботі зі спадкуванням ваші деструктори повинні бути віртуальними.

Віртуальне присвоювання

Оператор присвоювання можна зробити віртуальним. Однак, на відміну від деструктора, віртуальне присвоювання не завжди є хорошою ідеєю. Чому? Це вже виходить за рамки цього уроку. Отже, для збереження простоти в вашому коді, не рекомендується використовувати віртуальне присвоювання.

Ігнорування віртуальних функцій

У мові С++ ми можемо ігнорувати виклик перевизначень. Наприклад:

Тут ми хочемо, щоб посилання класу Parent на об’єкт класу Child викликало Parent::getName() замість Child::getName(). Щоб це зробити, потрібно просто використати оператор дозволу області видимості:

Ви, швидше за все, не будете використовувати це дуже часто, але знати про це варто.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (3 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *