Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Це потенційна проблема програми 11.1. Що буде, якщо ми захочемо ініціалізувати значенням об’єкт класу CountOn? Чи зможемо ми скористатися конструктором базисного класу з одним аргументом? Відповідь буде заперечною. Для похідного класу слід написати власний конструктор. Зробимо це в програмі 11.2

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Counter

{protected:

unsigned int count;

public:

Counter():count(0) //конструктор

{ }

Counter (int c):count(с)

{ }

 

unsigned int get_count()

{return count;}

 

Counter operator++ ()

{return Counter(++count);

}

};

 

class CountOn:public Counter //похідний клас

{public:

CountOn():Counter()

{ }

CountOn(int c):Counter(с)

{ }

 

CountOn operator—()

{return CountOn(--count);

}

};

////////////////////

int main()

{

clrscr();

CountOn c1;

CountOn c2(100);

cout <<”\nc1=”<<c1.get_count();

cout <<”\nc2=”<<c2.get_count();

++c1;++c1;++c1;

cout <<”\nc1=”<<c1.get_count();

--c2;--c2;

cout <<”\nc1=”<<c1.get_count();

CountOn c3=--c2;

cout<<”\nc3=”<<c3.get_count();

cout <<endl;

bioskey(0);

return 0;

}

Програма 11.2

Програма використовує два нові конструктори класу CountOn. Це конструктор без аргументів

CountOn():Counter()

{ }

і конструктор з одним аргументом

CountOn(int c):Counter(с)

{ }

 

В першому конструкторі використана нова для нас можливість: ім’я функції після двокрапки. Вона використовується для виклику конструктора базового класу. Якщо ми запишемо в функції main()

 

CountOn c1;

то компілятор створить об’єкт класу CountOn і викличе конструктор класу CountOn для його ініціалізації. Конструктор в свою чергу викличе конструктор базового класу, який виконає необхідні дії.

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

Конструктор

CountOn(int c):Counter(с)

{ }

з одним аргументом викликає відповідний конструктор з одним аргументом з базового класу.

 

Перезавантаження функцій

Ми можемо визначити для похідного класу методи з такими ж іменами, як і в базового класу. В цьому випадку має місце перезавантаження функцій. Така можливість може знадобитися, якщо для об’єктів базового і похідного класу в нашій програмі використовуються однакові виклики.

Проілюструємо це на такому прикладі. Одним з видів структур даних є стек, тобто такий набір даних, в якому останній доданий елемент видобувається першим. В формі стеків реалізується архітектура мікропроцесорів, функції передають аргументи і зберігають повернуті адреси у вигляді стеків. Далі приведена програма 11.3 моделює простий стек

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Stack

{private:

enum{MAX=10};

int st[MAX];

int top;

public:

Stack()

{top=0;}

void push(int var)

{st[++top]=var;}

int pop()

{return st[top--];}

};

 

////////////////////

int main()

{

clrscr();

Stack s1;

s1.push(11);

s1.push(22);

cout<<”1: “<<s1.pop()<<endl;

cout<<”2: “<<s1.pop()<<endl;

s1.push(33);

s1.push(44);

s1.push(55);

s1.push(66);

cout<<”3: “<<s1.pop()<<endl;

cout<<”4: “<<s1.pop()<<endl;

cout<<”5: “<<s1.pop()<<endl;

cout<<”6: “<<s1.pop()<<endl;

 

bioskey(0);

return 0;

}

Програма 11.3

Ця програма має деякі недоліки: не відсікає спроб покласти в стек більше елементів, ніж він спроможний помістити або видобути зі стеку більше елементів, ніж там є.

Для виправлення цих дефектів створимо новий клас Stack2, похідний від Stack. Об’єкти похідного класу поводяться як елементи базового, але попереджають про спроби переповнити стек або видобути елемент з порожнього стеку.

Далі приведений лістінг програми 11.4

#include <iostream.h>

#include <conio.h>

#include <bios.h>

#include<process.h>

class Stack

{protected:

enum{MAX=10};

int st[MAX];

int top;

public:

Stack()

{top=0;}

void push(int var)

{st[++top]=var;}

int pop()

{return st[top--];}

};

//////////

class Stack2:public Stack

{public:

 

void push(int var)

{if (top>=MAX-1)

{cout<<"Стек повний";exit(1); }

Stack::push(var);

}

 

int pop()

{

if (top<=0)

{cout<<"\nСтек порожній\n"; bioskey(0);exit(1); };

return Stack::pop();

}

};

////////////////////

int main()

{

clrscr();

Stack2 s1;

s1.push(11);

s1.push(22);

s1.push(33);

cout<<endl<<s1.pop();

cout<<endl<<s1.pop();

cout<<endl<<s1.pop();

cout<<endl<<s1.pop();

cout<<endl;

bioskey(0);

return 0;

}

Програма 11.4

В цій програмі клас Stack такий сам, як і в попередній, за винятком того, що дані класу оголошені як protected.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 38; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.239.111 (0.005 с.)