Лабораторна робота № 10
Тема: Поліморфізм
Мета: Ознайомитись із поліморфізмом
Теоретичні відомості:
Коли програмісти говорять про C + + та об'єктно-орієнтованому програмуванні, то дуже часто вживають термін поліморфізм. У загальному випадку поліморфізм є здатність об'єкта змінювати форму. Якщо ви заберете цей термін на частини, то виявите, що полі означає багато, а морфізм ставиться до зміни форми. Поліморфний об'єкт, отже, являє собою об'єкт, який може приймати різні форми. Цей урок вводить поняття поліморфізму і розглядає, як використовувати поліморфні об'єкти всередині ваших програм для спрощення і зменшення коду. До кінця цього уроку ви засвоїте наступні основні концепції:     * Поліморфізм являє собою здатність об'єкта змінювати форму під час виконання програми.     * C + + спрощує створення поліморфних об'єктів.     * Для створення поліморфних об'єктів ваші програми повинні використовувати віртуальні (virtual) функції.     * Віртуальна (virtual) функція - це функція базового класу, перед ім'ям якої стоїть ключове слово virtual.     * Будь-який похідний від базового клас може використовувати або перевантажувати віртуальні функції.     * Для створення поліморфного об'єкта вам слід використовувати вказівник на об'єкт базового класу.
Поліморфний об'єкт представляє собою такий об'єкт, який може змінювати форму під час виконання програми. Припустимо, наприклад, що ви програміст, який працює в телефонній компанії, і вам необхідно написати програму, яка емулює телефонні операції. Оскільки ви знайомі з тим, як люди використовують телефон, ви швидко виберете спільні операції, такі як набір номера, дзвінок, роз'єднання і індикація зайнятості. За допомогою цих операцій необхідно вказати наступний клас:     class phone     (     public:        void dial (char "number) (cout <<" набір "<<number <<endl;)        void answer (void) (cout << "Очікування відповіді" <<endl;)        void hangup (void) (cout << "Дзвінок виконаний - повісити трубку" <<endl;)        void ring (void) (cout << "Дзвінок, дзвінок, дзвінок" <<endl;)        phone (char * number) (strcpy (phone:: number, number););     private:        char number [13];     ); Наступна програма PHONEONE.CPP використовує клас phone для створення об'єкта-телефону:     # include <iostream.h>     # include <string.h>     class phone     (     public:        void dial (char * number) (cout << "набір" <<number <<endl;)        void answer (void) (cout << "Очікування відповіді" <<endl;)        void hangup (void) (cout << "Дзвінок виконаний - повісити трубку" <<endl;)        void ring (void) (cout << "Дзвінок, дзвінок, дзвінок" <<endl;)        phone (char * number) (strcpy (phone:: number, number););     private:        char number [13];     );     void main (void)     (        phone telephone ( "555-1212");        telephone.dial ( "212-555-1212");     ) Якщо ви продемонструєте програму вашому босу, то він або вона скаже, що ваша програма не робить розходжень між дисковим і кнопковим телефонами, і що вона не підтримує платні телефони, коли користувач має заплатити 25 центів, щоб зателефонувати. Оскільки ви знаєте спадкування, то приймете рішення породити класи touch_tone і pay_phone з класу phone, як показано нижче:     class touch_tone: phone     (     public:        void dial (char * number) (cout << "Пік пік набір" <<number <<endl;)        touch_tone (char * number): phone (number) ()     );     class pay_phone: phone     (     public:        void dial (char * number)        (           cout << "Будь ласка, заплатіть" <<amount << "центів" <<endl;           cout << "набір" <<number <<endl;        )        pay_phone (char * number, int amount): phone (number) (pay_phone:: amount = amount;)     private:        int amount;     ); Як бачите, класи touch_tone і pay__phone визначають свій власний метод dial. Якщо ви припустити, що метод dial класу, phone заснований на дисковому телефоні, то вам не буде потрібно створювати клас для дискового телефону. Наступна програма NEWPHONE.CPP використовує ці класи для створення об'єктів rotary, touch_tone і pay_phone:     # include <iostream.h>     # include <string.h>     class phone     (     public:        void dial (char * number) (cout << "набір" <<number <<endl;)        void answer (void) (cout << "Очікування відповіді" <<endl;)        void hangup (void) (cout << "Дзвінок виконаний - повісити трубку" <<endl;)        void ring (void) (cout << "Дзвінок, дзвінок, дзвінок" <<endl;)        phone (char * number) (strcpy (phone:: number, number););     protected:        char number [13];     );     class touch_tone: phone     (     public:        void dial (char * number) (cout << "Пік пік набір" <<number <<endl;)        touch_tone (char * number): phone (number) ()     );     class pay_phone: phone     (     public:        void dial (char * number) (cout << "Будь ласка, заплатіть" <<amount << "центів" <<endl; cout << "набір" <<number <<endl;)        pay_phone (char * number, int amount): phone (number) (pay_phone:: amount = amount;)     private:        int amount;     );     void main (void)     (        phone rotary ( "303-555-1212");        rotary.dial ( "602-555-1212");        touch_tone telephone ( "555-1212");        telephone.dial ( "212-555-1212");        pay_phone city_phone ( "555-1111", 25);        city_phone.dial ( "212-555-1212");     ) Якщо ви откомпіліруете і запустіть цю програму, на екрані з'явиться наступний висновок:     С: \> NEWPHONE <Enter>     Набір номера 602-555-1212     Пік пік набір 212-555-1212     Будь ласка, сплатіть за 25 центів     Набір номера 212-555-1212 Як уже згадувалося, поліморфний об'єкт представляє собою такий об'єкт, який змінює форму під час виконання програми. Попередня програма, наприклад, не використовувала поліморфні об'єкти. Інакше кажучи, в ній немає об'єктів, які б змінювали форму.
Хід роботи
Реалізувати поліморфізм в наступних структурах класів:
«Спорт клубу».
«Бібліотеки».
«Обувного магазину»
«Булочної»
«Мобільного магазину»
Тощо…