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

Создание полиморфного объекта-телефона

После того как вы показали начальству вашу новую телефонную программу, ваше руководство сказало вам, что ваш объект-телефон должен уметь эмулировать дисковый, кнопочный или платный телефон на выбор. Другими словами, для одного звонка объект-телефон мог бы представлять кнопочный аппарат, для другого выступал бы как платный телефон и т.д. Иначе говоря, от одного звонка к другому ваш объект-телефон должен изменять форму.

В этих разных классах телефона существует единственная отличающаяся функция — это метод 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 меняет форму с дискового телефона на кнопочный, а затем на платный:

#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");  }

Если вы откомпилируете и запустите эту программу, на экране дисплея появится следующий вывод:

С:\> POLYMORP <ENTER>

Набор номера 818-555-1212

Пик пик Набор номера 303-555-1212

Пожалуйста, оплатите 25 центов

Набор номера 212-555-1212

Поскольку объект poly_phone изменяет форму по мере выполнения программы, он является полиморфным.

Полиморфные объекты могут изменять форму во время выполнения программы

Полиморфный объект представляет собой такой объект, который может изменять форму во время выполнения программы. Для создания полиморфного объекта ваша программа должна использовать указатель на объект базового класса. Далее программа должна присвоить этому указателю адрес объекта производного класса. Каждый раз, когда программа присваивает указателю адрес объекта другого класса, объект этого указателя (который является полиморфным) изменяет форму. Программы строят полиморфные объекты, основываясь на виртуальных функциях базового класса.