Урок №165. Виртуальные деструкторы и присваивание

  Юрий Ворон  | 

    | 

  Обновлено 16 Окт 2018  | 

 448

Хотя 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 (6 оценок, среднее: 4,33 из 5)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ВОЛШЕБНАЯ ТАБЛЕТКА ПО С++