ТА_Методички / Lec_12
.pdfЦе оголошення розміщається всередині похідного класу після заголовка відповідного розділу. Зверніть увагу на те, що тип змінної в оголошенні рівня доступу вказувати не слід.
class base { public:
int j; // Відкритий член класу base } ;
//Закритий спадкоємець класу base. class derived: private base { public:
//Місце для оголошення рівня доступу. base::j; // Тепер змінна j знову відкрита.
.
.
};
Оскільки клас derived є закритим спадкоємцем класу base, відкрита змінначлен j із класу base стає закритою змінною-членом класу derived. Тому у розділ public класу derived ми помістили оголошення рівня доступу.
base::j; // Змінна j знову стала відкритою.
21/35
Цей спосіб можна застосовувати для відновлення статусу відкритих і захищених членів. Однак з його допомогою не можна підняти або понизити рівень доступу до члена класу. Наприклад, член, оголошений закритим у базовому класі, не можна робити відкритим у похідному, (Якби це було можливо, механізм інкапсуляції був би повністю зруйнований!)
Наступна програма ілюструє оголошення рівня доступу. Зверніть увагу на те, як відновлюється відкритий статус членів j, seti() і geti().
#include <iostream> using namespace std; class base {
int i; // Закритий член класу base public:
int j, k;
void seti(int x) { i = x; } int geti() { return i; }
};
// Закритий спадкоємець класу base. class derived: private base { public:
/* Наступні три оператори відновлюють
22/35
відкритий статус членів j, seti() і geti(). */ base::j; // Змінна j знову відкрита, а змінна к - ні. base::seti; // Функція seti() знову відкрита. base::geti; // Функція geti() знову відкрита.
// base::i; // Невірно, рівень доступу піднімати не можна. int a; // Відкритий член.
};
int main()
{
derived ob;
//ob.i = 10; // Не можна, тому що змінна i
//є закритим членом класу derived.
ob.j = 20; // Можна, так.як змінна j відкрита в класі derived.
//ob.k = 30; // Не можна, оскільки змінна к є
//закритим членом класу derived.
ob.a = 40; // Можна, тому що змінна а є відкритим // членом класу derived.
ob.seti(10) ;
23/35
cout << ob.geti() << " " << ob.j << " " << ob.a; return 0;
}
Цей спосіб дозволяє відновлювати рівень доступу до деяких відкритих або захищених членів класу, залишаючи похідний клас закритим.
5. Приклади програм
На закінчення, наведемо зразки типових завдань до лабораторної роботи.
Приклад 1.
Описати два базових класи з захищеною змінною цілого типу. В першому з них описати функцію додавання до цього числа, поки результат не перевищуватиме 1000, а в другому – одержання залишку при діленні на 5. Передбачити вивід знайдених значень на екран. Використовуючи множинне наслідування, описати похідний клас з функцією задання цих змінних. В головній функції main здійснити їх присвоєння, використовуючи функцію з похідного класу, а вивід знайдених значень, використовуючи функції з базових класів.
#include <iostream.h>
#include <conio.h>
#include <math.h>
24/35
# include <string.h> class bas1
{
protected: int a; public: void cub()
{
const int co=1000; int rob;
rob=0;
cout << "rob" << rob << "\n"; while(rob<co)
{
//rob+=pow(a,3);
rob+=a;
cout << "rob" << rob << "\n";
}
rob-=a;
cout << " Znahodzhennya sumy (<=1000): " << rob << "\n";
}
};
class bas2
25/35
{
protected: int a; public: void zal()
{
const int f=5; int za;
za=a;
cout << "za: " << za << "\n"; while(za>f)
{
za-=f;
cout << "za: " << za << "\n";
}
cout << "Zalyshok vid dilennya na 5: " << za << "\n";
}
};
class pohid: public bas1,public bas2
{
public:
void vvid(int A)
{
26/35
bas1::a=A;
bas2::a=A;
}
};
main ()
{
pohid cc; clrscr(); int a;
cout << "Vvedit' a: "; cin >> a;
cc.vvid(a);
cc.cub();
cc.zal(); getch (); return 0;
}
Результат
Vvedit' a: 49
Znahodzhennya sumy (<=1000): 980
Zalyshok vid dilennya na 5: 4
27/35
Приклад 2.
Наступний приклад демонструє використання принципів множинного спадкування для класу з членами різного типу.
Описати два базових класи з захищеними змінними: в першому типу char (назва Вашої групи), в другому – типу float (середній бал), і описати в них функції виводу цих змінних на екран. Використовуючи множинне спадкування, описати похідний клас з функціями задання значень змінним цього типу. В головній функції main шляхом звертання до функції з похідного класу задати ці змінні, а шляхом звертання до функцій з базових класів – вивести їх на екран.
#include <iostream.h> #include <conio.h> #include <string.h>
//Opys 1-ho bazovoho clasu class base1
{
protected: char aaa[10]; public:
void chov_grup(char *p); };
28/35
//Opys 2-ho bazovoho clasu class base2
{
protected: float bbb; public:
void chov_ser_bal(); };
//Opys pohidnoho clasu
class pohid:public base1,public base2
{
public:
void vvid(char *a,float b) {strcpy(aaa,a);bbb=b;}
};
//Opys fynkcij z 1-ho bazovoho clasu void base1::chov_grup(char *p) {strcpy(p,aaa);
cout<<"Nazva grupy "<<p<<"\n";
}
//Opys fynkcij z 2-ho bazovoho clasu void base2::chov_ser_bal() {float bal;bal=bbb;
29/35
cout<<"Serednij bal "<<bal<<"\n";} main()
{pohid cc;
char a1[10];float b1; clrscr();
cout<<"Vvedit' nazvu grupy\n"; cin>>a1;
cout<<"Vvedit' serednij bal\n"; cin>>b1;
cc.vvid(a1,b1); cc.chov_grup(a1); cc.chov_ser_bal(); getch();
return 0;
}
Результат
Vvedit' nazvu grupy kn-43
Vvedit' serednij bal 67.8
Nazva grupy kn-43 Serednij bal 67.800003
30/35
