Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

7.4 Використання заміщуючих функцій-членів.

Як бачимо, в похiдному класi, як правило, добавляють новi дані та

функцiї-члени. Однак, iснує можливiсть замiни(заміщення) функцiй-членів, наслiду-ваних з базового класу. Розглянемо такий клас TBase:

class Tbase

{ private:

char * sptr;

public:

TBase (cout char * s) {sptr=strdup(s);}

~TBase() {delete sptr;}

void Display(void){cout <<sptr<<'\n';}

};

Можна оголосити обєкт типу TBase:

TBase state ("California;);

i вивести рядок state : state.Display()

Припустимо, що пiзнiше ми вирiшили , що всi подiбнi рядки повиннi

починатися рядком "State:". Можна добитись цього так:

cout<<"State:";

state.Display()

Але змiни потрiбно вносити у всю програму. Кращий варiант розв`язку проблеми - вивести новий клас з TBase та замiнити наслiдувану функцiю-член Dispay() модифiкованою версiєю.

Можна описати похiдний клас слiдуючим чином:

class TState : public TBase

{ public:

TState (const char * s):TBase(s){ }

void Display (void); //замiщуюча функцiя

};

Бачимо, що тут оголошена функція-член, абсолютно ідентична відповідній функції базового класу. При роботі це означає, що вона заміщує базову. Можемо реалізувати її так:

void TState :: Display(void)

{ cout<<"State:";

TBase.Display(); // виклик замiщено· функцi·-члена

};

Оголошення та використання об’єкта класу

TState state("Ohio");

state.Display();

приведе до друку рядка "State.Ohio".

Аналогiчно можна поступити i з конструкторами в похiдних класах. Припустимо, що нам необхiдно мати кiлька класiв з рiзними iменами штатiв. Можна написати клас для кожного штату, подiбний слiдуючому:

class TPenssylvania : public TState

{

public:

TPenssylvania() : TState("Penssylvania"){}

};

Новий конструктор похідного класу, оголошений без параметрів передає рядок Penssylvania конструктору базового класа. Далі створюється об‘єкт Pens та вводиться ім’я штату:

TPens Pens;

Pens.Display();

Конструктори можуть мати довiльнi параметри. Нехай нам потрiбен буде клас , який зберiгає крiм назви штату , ще й кiлькiсть населення . Можна вивести його з TState:

class TPopulation : public TState

{

private:

long population;

public:

TPopulation( long n ,const char * name);

void Display(void);

};

TPopulation ::TPopulation(long n ,const char * name)

{ population=n;

TState ( name );

};

void TPopulation :: Display(void)

{ TState :: Display();

coun <<"Population :: "<<population<<'\n';

};

Далi використовувати можна його так:

TPopulation Nebraska (157000, "Nebraska");

Nebraska.Display();