Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВСЕ ЛАБОРАТОРНІ І СЕМЕСТР.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
250 Кб
Скачать
☆

Контрольні запитання

  1. Для чого утворюють віртуальні функції?

  2. Яка функція називається віртуальною?

  3. Яка функція – чисто віртуальна?

  4. Для яких класів утворюють віртуальні функції?

Лабораторна робота № 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"); }