При виході з області видимості C++ автоматично викликає деструктори у зворотному порядку за ієрархією успадкування: від похідного класу до базового. Наприклад, при виході об'єкта класу president з області видимості спочатку викликається деструктор похідного класу, який виконує оператор delete uppercasep, а потім – конструктор базового, що виконує оператор delete basep. На відміну від конструкторів, деструктор похідного класу ніколи не викликає безпосередньо деструктор базового (деструктор класу можна викликати безпосередньо як функцію-член).
Розглянемо ще один приклад:
Class base
{public:
base (char*n,shint t);
~base();};
Class derived:public base
{base m;
public:
derived (char*n);
~derived();};
derived::derived(char*n):(n,10),m("member",123){
//...}
Бачимо, що параметри конструктора члена класу m указуються при виклику конструктора похідного класу.
Використання заміщуючих функцій-членів
У похідному класі зазвичай додаються нові дані та функції-члени. Однак існує можливість заміни (заміщення) функцій-членів, успадкованих з базового класу. Розглянемо такий клас Base:
Class Base
{private:
char*sptr;
public:
Base(const char*s){sptr=strdup(s);}
~Base(){delete sptr;}
void Display(void){cout<<sptr<<'\n';}};
Можна оголосити об'єкт типу Base:
Base region("Rivne");
i вивести рядок: region.Display().
Припустимо, що пізніше ми вирішили, що всі подібні рядки мають починатися рядком "Region: ". Можна досягти цього так:
cout<<"Region:";
region.Display();
Однак зміни потрібно вносити в усю програму. Кращий варіант розв'язання проблеми – вивести новий клас з Base та замінити успадковану функцію-член Dispay() модифікованою версією.
Можна описати похідний клас таким чином:
Class Region:public Base
{public:
Region (const char*s):Base(s){ }
Void Display (void); //замiщувальна функцiя
};
Бачимо, що тут оголошена функція-член, абсолютно ідентична відповідній функції базового класу. При роботі це означає, що вона заміщує базову. Можемо реалізувати її так:
Void Region::Display(void)
{cout<<"Region:";
Base.Display(); //виклик замiщеної функцiї-члена
};
Оголошення й використання об’єкта класу
Region region("Rivne");
region.Display();
приведе до друку рядка "Region:Rivne".
Аналогічно можна вчинити i з конструкторами в похідних класах. Припустимо, що нам необхідно мати кілька класів з різними назвами областей. Можна написати клас для кожної області, подібний до такого: