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

  Юрий  | 

  Обновл. 27 Июн 2019  | 

 4983

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

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

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