Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мищишин електронка.doc
Скачиваний:
1
Добавлен:
08.12.2018
Размер:
1.04 Mб
Скачать

Void main(void)

{

phone telephone("555-1212"); telephone.dial("212-555-1212");

}

Якщо потрібно зробити різницю між кнопковим і дисковим телефоном, або виокремити платний дзвінок, тоді можна скористатися спадковістю і створити класи 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. Програма NEWPHONE.CPP використовує ці класи для створення об'єктів rotary, touch_tone і pay_phone:

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

Попередня програма не використовує поліморфні об'єкти. Інакше кажучи, в ній немає об'єктів, які б змінювали форму. Модифікуючи цю програму можна створити поліморфний об’єкт – телефон. Тобто для одного дзвінка об'єкт-телефон міг би представляти кнопковий апарат, для іншого виступав би як платний телефон і т.д. Інакше кажучи, від одного дзвінка до іншого об'єкт-телефон змінює форму. В цих різних класах телефону існує єдина відмінна функція - це метод dial. Для створення поліморфного об'єкту ви спочатку визначаєте функції базового класу, які відрізняються від функцій похідних класів тим, що вони віртуальні, передуючи їх прототипи ключовим словом virtual, як показано нижче:

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];

};

Потім потрібно у програмі створити вказівник на об'єкт базового класу phone:

phone *poly_phone;

Для зміни форми об'єкта потрібно присвоїти цьому вказівнику адресу об'єкта похідного класу, як показано нижче:

poly_phone = (phone *) &home_phone;

Символи (phone *), які слідують за оператором присвоєння, є оператором приведення типів, який повідомляє компілятору C++, що необхідно присвоїти адресу змінної одного типу (touch_tone) вказівнику на змінну іншого типу (phone). Оскільки програма може присвоїти вказівнику об'єкту poly_phone адреси різних об'єктів, то цей об'єкт може змінювати форму, а отже, є поліморфним. Наступна програма POLYMORP.CPP використовує цей метод для створення об'єкту-телефону. Після запуску програми об'єкт poly_phone змінює форму з дискового телефону на кнопковий, а потім на платний:

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: