Программирование >>  Расширенная версия языка c++ 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 227


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. Применение полиморфизма

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



1 ... 100 101 102 [ 103 ] 104 105 106 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.086
При копировании материалов приветствуются ссылки.
Яндекс.Метрика