Читайте также: |
|
При описі класу в його заголовку перелічуються всі класи, що є для нього базовими. Можливість звертання до елементів цих класів регулюється за допомогою ключів доступу private, protected і public:
class ім'я: [private | protected | public] базовий_клас
{ тіло класу };
Якщо базових класів не багато, вони перелічуються через кому. Ключ доступу може стояти перед кожним класом, наприклад:
class A {... };
class В {...};
class С {... };
class D: A. protected В, public С {...};
За замовчуванням для класів використовується ключ доступу private, а для структур — public.
Щоб зрозуміти, як один клас може успадковувати інші, розглянемо приклад, що, незважаючи на свою простоту, ілюструє кілька ключових положень спадкування.
Для початку оголошення базового класу:
// Завдання базового класу
class В {
int i;
public:
void set_i(int n);
int get_і();
};
Тепер похідний клас, що успадковує цей базовий:
// Завдання похідного класу
class D:public В {
int j;
public:
void set_j(int n);
int mul();
};
Зверніть увагу, що в оголошенні після імені класу D є двокрапка, за яким рзташовано ключове слово public і ім'я класу В. Для компілятора це вказівка, що клас D буде успадковувати усі компоненти класу В. Саме ключове словоpublic інформує компілятор про те, що, оскільки В буде успадковуватися, значить усі відкриті елементи базового класу будуть також відкритими елементами похідного класу. Однак усі закриті елементи базового класу залишаються закритими, і до них немає прямого доступу з похідного класу. Нижче приводиться закінчена програма, у якій використовуються класи ВиD:
// Простий приклад спадкування.
#include <iostream.h>
// Завдання базового класу
class base {
int i;
public:
void set_i(int n);
int get_i();
};
// Завдання похідного класу
class derived:public base {
int j;
public:
void set_j(int n);
int mul();
};
// Установка значення і у базовому класі
void base::set_і(int n)
{
i=n;
}
// Повернення значення і у базовому класі
int base::get_i()
{
return i;
}
// Установка значення j у похідному класі
void derived::set_j(int n)
{
j = n;
}
// Повернення значення і з base та, одночасно, j з derived
int derived::mul()
{
// похідний клас може викликати функції-члени базового класу
return j*get i();
}
main ()
{
derived ob;
ob.set_і(10); // завантаження і у base
ob.set_j(4); // завантаження j у derived
cout «ob.mul(); // друк числа 40
return 0;
}
Зверніть увагу на визначенняmul(). Відзначте, що функціяget_i(), що є членом базового класуВ, а не похідногоD, викликається усередині класуD, без якого б не було зв'язку з яким-небудь об'єктом. Це можливо тому, що відкриті члени В стають відкритими членами D. У функціїmul(), замість прямого доступу доi, необхідно викликати get_i() через те, що закриті члени базового класу (у даному випадку i) залишаються закритими для неї і недоступними для будь-якого похідного класу. Причина, по якій закриті члени класу стають недоступними для похідних класів - підтримка інкапсуляції. Якби закриті члени класу ставали відкритими просто за допомогою спадкування класу, інкапсуляція була б зовсім неможливою. Тут показана загальна форма спадкування базового класу:
Дата добавления: 2015-07-20; просмотров: 49 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Запам'ятайте! | | | Просте спадкування |