- •Лабораторна робота №1
- •Теоретичні положення
- •Хід роботи
- •Варіанти
- •Контрольні запитання
- •Лабораторна робота №2
- •Теоретичні відомості
- •Лабораторна робота №4
- •Теоретичні відомості
- •Хід роботи
- •Хід роботи
- •Контрольні запитання
- •Контрольні запитання
- •Лабораторна робота №5
- •Теоретичні відомості
- •Хід роботи
- •Контрольні запитання
- •Лабораторна робота № 8
- •Теоретичні відомості
- •Контрольні запитання
- •Лабораторна робота № 10
- •Абстрактні класи
- •Хід роботи
- •Контрольні запитання
- •Лабораторна робота № 11
- •Теоретичні відомості
- •Хід роботи
- •Лабораторна робота №12
- •Теоретичні положення
- •Хід роботи
- •Контрольні запитання
- •Лабораторна робота № 13.
- •Теоретичні положення
- •Хід работи
- •Варіанти
- •Література
Контрольні запитання
Для чого утворюють віртуальні функції?
Яка функція називається віртуальною?
Яка функція – чисто віртуальна?
Для яких класів утворюють віртуальні функції?
Лабораторна робота № 10
Тема : Використання абстрактних класів.
Мета: Ознайомитися з поняттям поліморфизму .Відладити програму, яка використовує ці поняття.
Література: Г.Шилдт,Самоучитель С++, С.В. Глушков, Практикум по С++.
Абстрактні класи
Для створення поліморфного об'єкту в програмі визначають один або декілька методів базового класу як віртуальні функції. Похідний клас може визначити свою власну функцію, яка виконується замість віртуальної функції базового класу, або використати базову функцію (іншими словами, похідний клас може і не визначати свій власний метод). Залежно від програми іноді не має сенсу визначати віртуальну функцію у базовому класі. Наприклад, об'єкти похідних типів можуть настільки сильно відрізнятися, що їм не треба буде використати метод базового класу. У таких випадках замість визначення операторів для віртуальної функції базового класу в програмі можна створити чисто віртуальну функцію, яка не містить операторів. Для створення чисто віртуальної функції програма вказує прототип функції, але не вказує її оператори. Замість них програма привласнює функції значення нуль, як показано нижче:
class phone
{ public: virtual void dial (char *number) =0; // Чисто виртуальная функция 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]; };
Кожен похідний клас, визначений в програмі, повинен визначити свою функцію замість чисто віртуальної функції базового класу.
Хід роботи
В програмі замінити метод
virtual void dial(char *number) { cout << "Набор номера " << number << endl; } на чисто віртуальний.
#include <iostream.h>
#include <string.h>
class phone
{ public: virtual 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)
{ pay_phone city_phone("702-555-1212", 25); touch_tone home_phone("555-1212"); phone rotary("201-555-1212") ; // Зробить об’єкт дисковим телефоном phone *poly_phone = &rotary; poly_phone->dial("818-555-1212"); // Замінить форму об’єкту на кнопковий телефон poly_phone = (phone *) &home_phone; poly_phone->dial("303-555-1212"); // Замінить форму об’єкту на коштовний телефон poly_phone = (phone *) &city_phone; poly_phone->dial("212-555-1212"); }
