Почему деструктор базового класса должен объявляться виртуальным?

Аватар Типичный программист
Отредактировано

17К открытий17К показов

Давайте разберемся, зачем нужны виртуальные методы. Рассмотрим следующий код:

			class Foo {
public:
	void f();
};

class Bar : public Foo {
public:
	void f();
}

Foo *p = new Bar();
p->f();
		

Вызывая p->f(), мы обращаемся к Foo::f(). Это потому, что р — указатель на Foo, a f() — невиртуальная функция.

Чтобы гарантировать, что p->f() вызовет нужную реализацию f(), необходимо объявить f() как виртуальную функцию.

Теперь вернемся к деструктору. Деструкторы предназначены для очистки памяти и ресурсов. Если деструктор Foo не является виртуальным, то при уничтожении объект Bar все равно будет вызван деструктор базового класса Foo.

Поэтому деструкторы объявляют виртуальными — это гарантирует, что будет вызван деструктор для производного класса.

Разбор взят из книги Гейл Л. Макдауэлл «Cracking the Coding Interview» (есть в переводе).

Следите за новыми постами
Следите за новыми постами по любимым темам
17К открытий17К показов