Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Полиморфизм. Виртуальные функции..doc
Скачиваний:
9
Добавлен:
15.07.2019
Размер:
62.98 Кб
Скачать

Void dial(char *number) {

cout<<"Pay "<< amount <<" r"<<endl<<"Connecting... "<< 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");

_getch();

}

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

Connecting...

Connecting by touch_tone...

Pay 25 cents

Connecting 212-555-1212

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

Заключение:

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

Виртуальные функции

Те функции, для которых можно определить заявленный интерфейс, но реализация которых (т.е. тело с операторной частью) возможна только для конкретных фигур, отмечены служебным словом virtual (виртуальные). В С++ виртуальность функции означает: "функция может быть определена позднее в классе, производном от данного".

Функции-элементы класса могут объявляться в C++ как виртуальные. Ключевое слово virtual заставляет компилятор генерировать для класса некоторую дополнительную информацию о функции. Происходит следующее: если виртуальная функция переопределяется в производном классе, и если имеется указатель или ссылка на базовый класс (которые могут с тем же успехом ссылаться на производный класс, поскольку производный объект есть в то же время и объект базового класса), то при обращении к функции через указатель (ссылку) будет вызвана правильная функция-элемент (т. е. соответствующая типу действительного объекта) — базового или одного из производных классов, в зависимости от типа конкретного объекта.

#include <condefs.h>

#include <conio.h>

#include <stdio.h>

class One { // Базовый класс.

public:

virtual void ShowVirt() {// Виртуальная функция.

printf("It's One::ShowVirt()!\n");

}

void ShowNonVirt(){ // Не-виртуальная функция.

printf("It's One::ShowNonVirt()!\n") ;

}

};

class Two: public One { // Производный класс.

public:

void ShowVirt(){

printf ("It's Two::ShowVirt() !\n") ;

}

void ShowNonVirt (){

printf("If s Two::ShowNonVirt ()!\n") ;

};

};

int main(void){

Two t;

One *pOne = &t;

pOne->ShowVirt(); // Вызовет Two::ShowVirt().

pOne->ShowNonVirt(); // Вызовет One::ShowNonVirt().

// Следующий вызов подавляет виртуальный механизм:

pOne->One::ShowVirt(); // Явно вызывает One::ShowVirt().

_getch();

return 0;

}

Виртуальная функция не может быть статической.