Віртуальні деструктори
Деструктори базового класу обов’язково повинні бути віртуальними. Припустімо, щоб видалити об’єкт породженого класу, ми виконуємо 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; просмотров: 1129;