Віртуальні деструктори

Деструктори базового класу обов’язково повинні бути віртуальними. Припустімо, щоб видалити об’єкт породженого класу, ми виконуємо delete щодо вказівника базового класу, що вказує на породжений клас. Якщо деструктор базового класу не є віртуальним, тоді delete, будучи звичайним методом, викличе деструктор для базового класу замість того, щоб запустити деструктор для породженого класу. Це призведе до того, що буде видалена тільки та частина об’єкту, яка відноситься до базового класу. Це демонструє програма 22.5.

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

///////////////

class Base

{public:

~Base()

// virtual ~Base()

{cout<<”Base remove\n”;}

};

////////////

class Derv:public Base

{public:

~Derv()

{cout<<”Derv remove\n”;}

};

/////////////

int main()

{clrscr();

Base* pBase=new Derv;

delete pBase;

bioskey(0);

return 0;

}

Програма 22.5

 

Програма видасть такий результат

Base remove

Це означає, що деструктор для Derv не викликався взагалі! До такого результату призвело те, що деструктор базового класу в приведеному лістінгу невіртуальний. Виправити це можна, якщо зробити його віртуальним, закоментувавши перший рядок означення деструктора і активувавши другий:

//~Base()

virtual ~Base()

Тепер результат програми виглядатиме:

Derv remove

Base remove

Тільки тепер обидві частини об’єкту породженого класу видалені коректно.. Звичайно, якщо жоден з деструкторів не робить нічого важливого, а, наприклад, просто вивільняє пам’ять, виділену командою new, тоді їх віртуальність не є особливо потрібною. Але в загальному випадку, якщо треба бути певним в тому, що об’єкти породжених класів видаляються так, як потрібно, слід завжди робити деструктори базових класів віртуальними.

 








Дата добавления: 2015-08-26; просмотров: 1121;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.