Зачем нужен виртуальный деструктор?

Зачем нужен виртуальный деструктор?

Когда же следует объявлять деструктор виртуальным? Cуществует правило - если базовый класс предназначен для полиморфного использования, то его деструктор должен объявляться виртуальным. Для реализации механизма виртуальных функций каждый объект класса хранит указатель на таблицу виртуальных функций vptr, что увеличивает его общий размер. Обычно, при объявлении виртуального деструктора такой класс уже имеет виртуальные функции, и увеличения размера соответствующего объекта не происходит.

Если же базовый класс не предназначен для полиморфного использования (не содержит виртуальных функций), то его деструктор не должен объявляться виртуальным.

Пример: 

	class Base
	{
	public:
	    virtual ~Base()
	    {
	        std::cout << "Hello from ~Base()" << std::endl;
	    }
	};
	
		
	class Derived : public Base
	{
	public:
	    virtual ~Derived()
	    {
	        // Здесь могла бы быть очистка ресурсов
	        std::cout << "Hello from ~Derived()" << std::endl;
	    }
	};
	
		
	Base *obj = new Derived();
	delete obj;

 
Output:

	Hello from ~Derived()
	Hello from ~Base()

 
Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только~Base():

Output:
Hello from ~Base()

0 комментариев

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
© 2015 Все права соблюдены.