ТА_Методички / Lec3_11
.pdfob1.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
