09 полиморфизм
.pdf09 – 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);
}