Почему деструктор базового класса должен объявляться виртуальным?
17К открытий17К показов
Давайте разберемся, зачем нужны виртуальные методы. Рассмотрим следующий код:
Вызывая p->f()
, мы обращаемся к Foo::f()
. Это потому, что р — указатель на Foo, a f() — невиртуальная функция.
Чтобы гарантировать, что p->f()
вызовет нужную реализацию f(), необходимо объявить f() как виртуальную функцию.
Теперь вернемся к деструктору. Деструкторы предназначены для очистки памяти и ресурсов. Если деструктор Foo не является виртуальным, то при уничтожении объект Bar все равно будет вызван деструктор базового класса Foo.
Поэтому деструкторы объявляют виртуальными — это гарантирует, что будет вызван деструктор для производного класса.
Разбор взят из книги Гейл Л. Макдауэлл «Cracking the Coding Interview» (есть в переводе).
17К открытий17К показов