|
Программирование >> Программирование на языке c++
#include <graphics.h> class shape { это абстрактный класс int xb,yb,xe,ye; public: shape(int hb.int vb.int he.int ve) : конструктор xb(hb), yb{vb), xe{he), ye(ve) {} virtual void move(int,int)=0; абстрактная функция virtual void copy(int,int)=0; абстрактная функция virtual void rotate(int)=0; абстрактная функция class wrong : public shape { это абстрактный класс public: wrong(int hb,int vb.int he,int ve) : shape(hb,vb,he,ve) {} struct shape4 : public shape { это абстрактный класс shape4{int hb.int vb.int he.int ve) : shape{hb,vb,he,ve) {} virtual void draw(int,int,int,int)=0; struct rectangle : public shape4 { это не абстрактный класс rectangle (int hb,int vb.int he,int ve) : shape4(hb,vb,he,ve) { int gd=DETECT, gm; initgraph(&gd,&gm, ); } ~rectangle () { closegraph(); } деструктор virtual void move(int x.int y) { /* какие-то действия */ } virtual void copy(int x,int y) { /* какие-то действия */ } virbal void rotate(int r) { /* какие-то действия */ } virtual void draw(int a,int b.int c.int d) { ::rectangle(a,b,c,d); }; wrong& f(wrong*,wrong&) { /* какие-то действия */ } , нет ошибки void main(void) { wrong wr(1,2,3,4); ошибка: cannot create instance of abstract class rectangle r(10,10,100,100); r - объект класса rectangle r.draw(20,20,80,80); вычерчивание прямоугольника на } экране Перечислим основные свойства и правила использования абстрактных классов: > виртуальная функция, которая приравнивается нулю, называется абстрактной виртуальной функцией; > класс, содержащий хотя бы одну абстрактную виртуальную функцию, называется абстрактным классом; > запрещается создание объектов абстрактных классов. Абстрактные классы могут использоваться только как базовые классы для других классов; > пусть Б<-П и Б - абстрактный класс. Если производный класс П не описывает абстрактные виртуальные функции класса Б, то он будет тоже абстрактным классом; > пусть Б - абстрактный класс, тогда аргументы любой функции не могут иметь тип Б, и функция не может возвращать значение типа Б; > разрещается объявлять указатели на абстрактный класс; > допускаются ссылки на абстрактные классы, позволяющие создавать временные объекты, для которых не требуется инициализация (см. приведенный выше пример); -♦основная цель использования абстрактных классов - это описание общего интерфейса для их производных классов. При этом не делается акцент на реализацию соответствующих функций и задаются только общие имена для идентичных функций в различных классах. 4.5. Множественное наследование (построение классов, которые являются производными от многих базовых классов) Производный класс может иметь два и более базовых класса. В этом случае при объявлении производного класса после знака : записывается (через запятые) несколько базовых классов. Рассмотрим пример. Пусть имеется два класса: окно с заголовком (window w caption); окно в прямоугольной рамке, содержащей элементы (курсоры) для вертикального и горизонтального позиционирования - скроллинга (window w scroll). БАЗОВЫЙ КЛАСС БАЗОВЫЙ КЛАСС Рис. 4.3. Пример множественного, наследования Предположим, мы хотим использовать новое окно с заголовком и возможностью позиционирования (window w caption and scroll). Тогда имеет смысл построить производный класс wmdow w caption and scroll от двух рассмотренных выше базовых классов (wmdow w caption и window w scroll): class window w caption and scroll : public: window w caption, public: window w scroll { .......................}; Иерархическая структура, в которой производный класс имеет более одного базового класса, называется множественным наследованием (рис. 4.3). При таком наследовании производный класс имеет собственные компоненты и может использовать компоненты-данные и компоненты-функции нескольких базовых классов, например: #include <iostream.h> class window w caption { public: void draw caption(char* caption); вывод заголовка окна char* get caption(void); возврат значения строки - заголовка
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |