Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

09 полиморфизм

.pdf
Скачиваний:
14
Добавлен:
27.03.2015
Размер:
216.35 Кб
Скачать

09 – 1

4. ВИРТУАЛЬНЫЕ ФУНКЦИИ И ПОЛИМОРФИЗМ

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

Shape

Triangle Circle yyy

draw() – функция-элемент БК и ПК

09 – 2

ПРОБЛЕМА:

yyy

РЕШЕНИЕ:

yyy

ОБЪЯВЛЕНИЕ ВИРТУАЛЬНОЙ ФУНКЦИИ (ВФ):

virtual void draw();

СВОЙСТВА ВФ:

yyy

09 – 3

4.2. Абстрактные базовые и конкретные классы

Абстрактный класс

Абстрактный базовый класс (АБК).

Конкретный класс

ПРИМЕР:

АБК 3DimObj

Cube Sphere Cylinder

09 – 4

ОБЪЯВЛЕНИЕ ЧИСТОЙ ВИРТУАЛЬНОЙ ФУНКЦИИ:

virtual float getData() = 0;

4.3. Полиморфизм

09 – 5

//Программа из п.3.5 (см. выше):

//БК Worker (сотрудник НГТУ)

//ПК Teacher (преподаватель с

//почасовой оплатой); БК и ПК содержат

//невиртуальную функцию print()

//ОБК и УБК, указывающий на ОБК

Worker w, *wPtr = &w;

// ОПК и УПК, указывающий на ОПК

Teacher t, *tPtr = &t;

09 – 6

// Вызов функции print без полиморфизма:

wPtr->print(); tPtr->print();

//работает функция БК

//работает функция ПК

//Если сделать фунцию print виртуальной,

//то возможен ее полиморфный вызов:

wPtr = &t; wPtr->print();

//УБК указывает на ОПК

//работает функция ПК

09 – 7

Замечания: yyy

4.4. Использование полиморфизма

ИЕРАРХИЯ КЛАССОВ

Worker

Boss Comm

09 – 8

//АБК Worker представляет общие свойства

//сотрудников и содержит две чистые ВФ,

//подробно определенные в двух ПК;

//ПК Boss представляет сотрудников

//с твердым окладом;

//ПК Comm представляет сотрудников

//с зарплатой вида

//”базовый оклад + комиссионные”;

//ВФ earnings() и print() – вычисление и

//печать зарплаты; они вызываются для

//ОПК через УБК,т.е. методом

//динамического связывания

09 – 9

class Worker {

//

имя

char *name;

char *fam;

//

фамилия

public:

Worker(char *, char *); ~Worker();

char * getName(); char * getFam();

09 – 10

// чистые ВФ

virtual float earnings() = 0; virtual void print() = 0;

};

Worker::Worker(char *n, char *f)

{

name = new char [strlen(n) + 1]; strcpy(name, n);

fam = new char [strlen(f) + 1]; strcpy(fam, f);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]