Uppercase string: Grushevskiy

При виході з області видимості 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 з конструкторами в похідних класах. Припустимо, що нам необхідно мати кілька класів з різними назвами областей. Можна написати клас для кожної області, подібний до такого:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: