![]() |
|
Программирование >> Расширенная версия языка c++
class triangle: public area ( public: double getareaO { double dl d2; - getdim (dl, d2); return 0.5 * dl * d2; i-., int main() area rectangle r; triangle t; r.setarea (3.3,4. 5) ; t. setarea (4.0, 5.0); P &;:; cou Площадь прямоугольника: p->getarea() \n; class area ( г, ,i double dlml, dim2; размеры фигуры . public: voi (double dl, double d2) t diml = dl; diift2 = d2; vv - . у !.--\ t:- voi m(double &dl, double bd2) dl = diml; d2 = dim2; - virtual double getareaO = 0; чистая виртуальная функция class rectangle: public area { public: - . double { double dl, d2; getdim(dl, d2); return dl * 316 . Самоучитель -/0++ p = &t; cout Площадь треугольника: p->getarea () \n; return 0; i.: .-. Теперь то, что функции reaQ является чистой виртуальной, гарантирует ее обязательную подмену в каждом производном классе. 2. В следующей программе показано, как при наследовании сохраняется виртуальная природа функции: /* Виртуальная функция при наследовании сохраняет свою виртуальную природу */ t г.: ttinclude <iostreaiti> using namespace std; . - i , class base { public: virtual void funcO { cout Вынолнение фунщии f unc ( ) базового класса \n ; class derivedl: public base { public: void cout Вынолнение функнии func() класса derivedl \n ; ,. V . ; - Класс derivedl наслеется классом derived2 class derived2: public derivedl { public: void cout Вынолнение функнии func() класса derived2\n ; i ... base *p; base ob; derivedl d obl; derived2 d ob2; : ... . * Главно. Виртуальные функции 317 р = 4оЬ; - , , , p->func(); функция func О базового класса , , , ,- . р = 4d obl; p->func(); функции () производного класса derivedl р = £d ob2; p->func(); функции О производного класса derived2 / return 0; :f В этой программе виртуальная функция сначала наследуется классом derivedl, в котором она подменяется. Далее класс derivedl наследуется классом derivedl. В классе derived! функция func() снова подменяется. Поскольку виртуальные функции являются иерархическими, то если бы в классе derived! функция func() не подменялась, при доступе к объекту d ob2 использовалась бы переопределенная в классе derivedl версия функции func(). Если бы функция funcO не подменялась ни в классе derivedl, ни в классе derivedl, то все ссылки на функцию func() относились бы к ее определению в классе base. Упражнения] ,. , 1. Проведите эксперимент с двумя программами из предыдущих примеров. Попытайтесь создать объект, используя класс area из примера 1, и проанализируйте сообщение об ошибке. В примере 2 попытайтесь удалить переопределение функции (iiiic() внутри класса derived!. Убедитесь, что тогда действительно будет использоваться та версия функции func(), переопределение которой находится в классе derivedl. 2. Почему нельзя создать объект абстрактного класса? 3. Что произойдет в примере 2 при удалении переопределения функции func() из класса derivedl? Будет ли при этом программа компилироваться и запускаться? Если да, то почему? 10.4. Применение полиморфизма Теперь, когда вы знаете, как использовать виртуальные функции для реализации динамического полиморфизма, самое время рассмотреть, зачем это нужно. Как уже много раз в этой книге отмечалось, полиморфизм является процессом, благодаря которому общий интерфейс применяется к двум или более схожим (но технически разным) ситуациям, т. е. реализуется философия один интерфейс, множество методов . Полиморфизм важен потому,
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.086
При копировании материалов приветствуются ссылки. |