Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
12.02.2016
Размер:
179.7 Кб
Скачать

ob1.showk();

ob2.set(3, 4); ob2.show(); ob2.setk(); ob2.setm(); ob2.showk(); ob2.showm(); return 0;

}

Однак, якби до класу base застосовувався механізм закритого спадкування, то всі його члени стали б закритими членами класу derived1 і були недоступні класу derived2. (У той же час змінні i і j були б як і раніше доступні класу derived1). Ця ситуація ілюструється наступною програмою (вона містить помилку й не компілюється).

// Ця програма містить помилку.

#include <iostream> using namespace std;

class base { protected: int i, j; public:

11/22

void set(int a, int b) { i=a; j=b; }

void show() { cout << i << " " << j << "\n"; } };

//Тепер всі члени класу base є закритими членами

//класу derived1.

class derived1 : private base { int k;

public:

//Це робити можна, оскільки змінні i і j

//є закритими членами класу derived1.

void setk() { k = i*j; } // Ok void showk() { cout << k << "\n"; } };

//Доступ до членів i, j, set() і show() не спадковується. class derived2 : public derived1 {

int m public:

//Неправильно, тому що змінні i і j є закритими

//членами класу derived1

void setm() { m = i-j; } // Помилка void showm() { cout << m << "\n"; }

};

12/22

int main ()

{

derived1 ob1; derived2 ob2;

ob1.set(1, 2); // Помилка, викликати функцію set () не можна. obl.show(); // Помилка, викликати функцію show() не можна. return 0;

ob2.set(3, 4); // Помилка, викликати функцію set() не можна. ob2.show(); // Помилка, викликати функцію show() не можна. return 0;

}

Навіть якби до класу base застосовувалося закрите спадкування, клас derived1 як і раніше мав би доступ до його відкритих і захищених членів Однак ці привілеї іншим спадкоємцям не передаються.

13/22

Захищене спадкування

До базового класу можна застосовувати механізм захищеного спадкування. При цьому всі відкриті й захищені члени базового класу стають захищеними членами похідного класу. Розглянемо приклад.

#include <iostream> using namespace std;

class base { protected:

int i, j; // Закриті члени класу base, // доступні, класу derived.

public:

void setij(int a, int b) { i=a; j=b; }

void showij() { cout << i << " " << j << "\n"; } };

// Клас, отриманий за допомогою захищеного спадкування. class derived : protected base {

int k; public:

//Клас derived має доступ до членів i, j і setij()

//із класу base.

14/22

void setk() { setij(10, 12); k = i*j; }

// Звідси можна викликати функцію showij(). void showall) { cout << k << " "; showij(); } };

int main ()

{

derived ob;

//ob.setij(2, 3); // Невірно, функція setij() є

//закритим членом класу derived.

ob.setk();

// Вірно, викликається відкритий член класу derived.

ob.showall();

// Вірно, викликається відкритий член класу derived.

// ob.showij();

// Невірно, функція showij() є

return 0;

// захищеним членом класу derived

 

}

 

Як видно з коментарів, незважаючи на те що функції setij() і showij() є відкритими членами класу base, у класі derived, утвореному за допомогою

15/22

захищеного спадкування, вони стають захищеними. Це значить, що функції main() вони не доступні.

На закінчення, наведемо зразки типових завдань до лабораторної роботи.

Описати базовий клас з функціями присвоєння і виводу (cout) двох змінних цілого типу. Оголосити їх захищеними. В похідному класі з використанням принципу наслідування реалізувати знаходження максимального з цих чисел. Написати головну програму, в якій ці змінні задаються і виводяться, як об’єкти базового класу, а максимальне значення виводиться, як елемент похідного класу.

Програма

main()

 

#include<iostream.h>

{

 

int a,b;

 

#include<conio.h>

clrscr();

 

class sdf

sdf hj;

//Екз. баз. класу

{

sdfg hh;

//Екз. пох. класу

public:

hj.df(7,2);

int a,b;

hj.df1();

 

// public:

hh.dfp(7,2);

void df(int ak,int bk)

hh.mmaxa();

{

 

 

16/22

a=ak;

getch();

b=bk;

return 0;

}

}

void df1()

Результат

{

 

cout<<"\n" <<

Znachennya a: 7

"Znachennya a: "<< a

 

<<"\n"<< "Znachennya b:

Znachennya b: 2

" <<b;

 

}

Maxymum dvoh chysel: 7

};

 

class sdfg: public sdf

 

{

 

public:

 

void dfp(int ak,int bk)

 

{

 

a=ak;

 

b=bk;

 

}

 

void mmaxa()

 

{

 

// a=ak;

 

17/22

// b=bk; int amax;

if(a<b) amax=b; else amax=a;

cout<< "\n Maxymum dvoh chysel: "<< amax;

}

};

Наступний приклад демонструє використання задання даних у базовому класі, а їхній вивід функціями з базового та похідного класів.

#include<iostream.h>

#include<conio.h>

#include<fstream.h>

class basce

{

public: char *str;

double chys;

// Funkciya prysvoyuvannya

18/22

void vvid(char*strichka,double chyslo)

{

str=strichka;

chys=chyslo;

}

// Funkciya vyvodu void vyvid()

{

int n;

cout << "Symvol'ne, double=";

//for (n=0;n<4;n++)

//cout << str [n]; cout << str;

cout <<","; //cout<<end1; cout << chys;

}

};

class first:public basce

{

public:

//Funkciya prysvoyennya

void in(char *strichka)

19/22

{

char *st; str=strichka;

}

//Funkciya vyvodu void out()

{

cout << "Strichka=";

//for (int n=0;n<4;n++) //cout << str[n];

cout << str;

}

};

main()

{

clrscr(); basce class_1; first class_2; int i;

char im_1[4]; double xd;

cout << "Enter strichka, chyslo:";

//cout << endl;

20/22

Соседние файлы в папке ТА_Методички