01.05 Позитивные технологии
01.05 Позитивные технологии
01.05 Позитивные технологии

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

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

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К показов