Учимся программировать на языке C++

ЧТО ТАКОЕ ПОЛИМОРФИЗМ


Полиморфный объект представляет собой такой объект, который может изменять форму во время выполнения программы. Предположим, например, что вы программист, работающий в телефонной компании, и вам необходимо написать программу, которая эмулирует телефонные операции. Поскольку вы знакомы с тем, как люди используют телефон, вы быстро выберете общие операции, такие как набор номера, звонок, разъединение и индикация занятости. С помощью этих операций вы определите следующий класс:

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

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


Содержание раздела