Конструктори та деструктори в похідних класах

Як уже зазначалося, похідний клас зазвичай містить конструктор, якщо він визначений i в базовому. Конструктор у похідному класі потрібен принаймні для того, щоб викликати конструктор базового з відповідним параметром. Синтаксично допускається відсутність конструктора в похідному класі, якщо конструктор базового не має параметрів (void -конструктор).

Деструктори не вимагають таких строгих правил при їх використанні. У похідному класі деструктор потрібен лише за наявності членів, які необхідно видалити при виході об'єкта з області видимості.

Розглянемо базовий клас, оголошений таким чином:

Class Base

{private:

char*basep;

public:

Base(const char*s){basep=strdup(s);}

~Base(){delete basep;}

const char*GetStr(void){return basep;}};

Конструктор класу викликає бібліотечну функцію strdup() для створення копії рядкового аргументу у вигляді динамічної змінної з присвоєнням адреси виділеної пам'яті покажчику basep. Деструктор звільняє цей блок пам'яті. При створенні об'єкта типу

Base president("Grushevskiy");

конструктору класу передається рядок "Grushevskiy", при цьому він створює копію рядка та присвоює її адресу члену basep об'єкта president. Коли president виходить з області видимості, деструктор знищує рядок.

Оголосимо похiдний клас:

Class Derived: public Base

{private:

char*uppercasep;

public:

Derived(const char*s)

~Derived(){delete uppercasep;}

const char*GetStr(void){return uppercasep;}};

До полів, успадкованих з Base, Derived додає закритий член – символьний покажчик uppercasep, який посилається на копію рядка, що зберігається в Base, із символами, перетвореними на великі. Деструктор похідного класу знищує цей новий рядок.

Конструктор Derived можна реалізувати так:

Derived()::Derived(const char*s)

:Base()

{uppercasep=strupr(strdup(s));};

Конструктор Derived викликає конструктор Base, що поміщає рядок, на який посилається s, у купу та ініціалізує basep адресою копії цього рядка. Потім конструктор похідного класу створює ще одну копію рядка, перетворюючи її символи на маленькі та присвоюючи uppercase адресу цієї копії.

Якщо ми створюємо об'єкт типу Derived, то при цьому створюються дві копії рядка. Розглянемо приклад:

Derived president("Grushevskiy");

cout<<"original string:<<president.GetStr()<<'\n';

cout<<"uppercase string:<<president.GetStr()<<'\n';

Результат:

Original string: Grushevskiy


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



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