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

1 ... 48 49 50 [ 51 ] 52 53 54 ... 159


#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); возврат значения

строки - заголовка



1 ... 48 49 50 [ 51 ] 52 53 54 ... 159

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