
Практичне заняття № 16
Тема: Наслідування у програмному середовищі С++: множинне наслідування
Мета:навчити роботи із конструкторами при множинному наслідуванні
Обладнання: комп’ютери Pentium, Celeron.
Програмне забезпечення: ОС Windows XP, С++ Builder.
Теоретична частина
Однією з найбільш потужних властивостей класів у С++ є можливість їхнього розширення шляхом наслідування.
Поняття наслідування
Наслідування – це процес створення нового класу шляхом додавання нових членів до вже існуючого класу.
У термінології С++ клас, до якого додаються нові члени, т. б. клас, що наслідується, називається базовим класом. А клас, що наслідує базовий клас, називається похідним класом.
Наслідування дозволяє одному класу наслідувати характеристики іншого. При цьому похідний клас отримує всі функціональні можливості базового класу, й може бути вдосконалений за рахунок додавання власних. Т. б., похідний клас являє собою спеціалізовану версію базового класу. Похідний клас наслідує всі члени, визначені в базовому класі, й додає до них власні унікальні елементи.
Треба зауважити, що ви можете додавати нові функції та данні, але не можете знищувати нічого, що належить базовому класу. Базовий клас при наслідуванні залишається незмінним.
Крім того, слід пам’ятати, що наслідування не працює у зворотному напрямку. Т. б. базовому класу та його об’єктам недоступні похідні класи.
Визначення похідного класу
Опис в програмі нового класу вказує на те, що він є похідним класом від іншого класу. Для цього використовується знак двокрапки ( : ), за ним слідує специфікатор доступу та ім’я базового класу.
Загальний синтаксис оголошення класу, що наслідує базовий клас, має такий вигляд:
class ім’я_похідного_класу : специфікатор_доступу ім’я_базового_класу { // тіло похідного класу }; |
Приклад: створюється базовий клас TwoShape, в якому зберігаються основні параметри (ширина та висота) двовимірного об’єкта, й похідний клас Triangle, створений на основі TwoShape.
#include <iostream> #include <cstring> #include <conio.h> using namespace std; // оголошення базового класу class TwoShape { public: double width; double height; void showDim() { cout << "Width and height amount to " << width << " and " << height << "\n"; } }; // оголошення похідного класу class Triangle : public TwoShape { public: char style[20]; double area() { return width* height/2; } void showStyle() { cout << "This triangle is" << style << "\n"; } }; int main() { Triangle t1; Triangle t2; //всі члени класу Triangle доступні для об'єктів класу //Triangle, навіть ті, що наслідувані від класу TwoShape t1.width=4.0; t1.height =4.0; strcpy(t1.style,"isosceles"); // рівнобедрений t2.width=8.0; t2.height =12.0; strcpy(t2.style,"right"); // прямокутний cout << "Information about triangle t1:\n"; t1.showStyle(); t1.showDim(); cout<<"Triangle area "<<t1.area()<<"\n"<<"\n"; cout << "Information about triangle t2:\n"; t2.showStyle(); t2.showDim(); cout<<"Triangle area "<<t2.area()<<"\n"; getch(); return 0; } |
В даному прикладі клас TwoShape визначає атрибути „узагальненої” двохвимірної фігури (наприклад, квадрата, прямокутника, трикутника тощо). В класі Triangle створюється специфічний тип об’єкта класу TwoShape, в даному випадку трикутник. Клас Triangle містить всі елементи класу TwoShape й, крім того, поле style, функцію area() та функцію showStyle(). У змінній style зберігається опис типу трикутника, функція area() обчислює й повертає його площу, а функція showStyle() відображає дані про тип трикутника.
Звернімо увагу на синтаксис, що використовується в оголошенні класу Triangle, щоб зробити його похідним від класу TwoShape.
class Triangle : public TwoShape { |
Оскільки клас Triangle включає всі члени базового класу TwoShape, то він може звертатися до членів width й height всередині методу area(). Крім того, всередині функції main() об’єкти t1 й t2 можуть безпосередньо посилатися на члени width й height так, немов би вони є частиною класу Triangle.