89782

Типы классов в С++

Лекция

Информатика, кибернетика и программирование

Механизм виртуального вызова может быть подавлен с помощью явного использования полного квалифицированного имени функции базового класса.

Русский

2015-05-13

92.82 KB

2 чел.

Типы классов в С++

Содержание

Типы классов

  •  полиморфный класс
  •  виртуальные функции
  •  абстрактный класс
  •  локальный и вложенный классы
  •  параметризованный класс
  •  параметризованные функции
  •  контейнерный класс
  •  контейнер с процедурой поэлементной обработки
  •  контейнер на основе шаблон

Полиморфные классы

Виртуальная функция обязательно должна быть компонентой некоторого класса.

Класс, содержащий хотя бы одну виртуальную функцию, называется полиморфным.

Она может быть объявлена дружественной другому классу, но не может быть объявлена статической (static). 

Механизм виртуального вызова может быть подавлен с помощью явного использования полного квалифицированного имени функции базового класса.

Абстрактные классы

Абстрактным классом называется класс, в котором есть хотя бы одна чистая (пустая) виртуальная функция формата:

virtual тип имя_функции (список_формальных_параметров)=0;

Такая функция «ничего не делает» и не доступна для вызовов. 

Ее назначениеслужить основой для подменяющих ее функций в производных классах. Для такого класса создать объект невозможно, но можно определять указатели и ссылки на абстрактные классы. Абстрактный класс может использоваться только в качестве базового для производных классов. Абстрактный класс может быть создан на основе какого-либо базового типа. Его нельзя использовать при явном приведении типов.

Пример #8. Абстрактный класс

На основе базового класса POINT построим абстрактный класс FIGURE, в котором определены:

  •  конструктор figure
  •  чистая виртуальная функция show для вывода изображения фигуры
  •  метод скрытия фигуры hide и перемещения фигуры move

//FIGURE.CPP- класс «фигура»

#includepoint.cpp

class figure: public point{

public:

figure(point p): point(p.givex(), p.givey()){}

virtual void show()=0;

void move(point p){

hide();  x=p.givex(); y=p.givey();  show();

}

void hide() 

{int cc, bk;

cc=getcolor();

bk=getbkcolor();

setcolor(bk);

show();

setcolor(cc);}

};

//ELLIPS.FIGкласс «эллипс»

class ellips: public figure{

int rx,ry;

public: 

ellips(point d, int radx, int rady): figure(d) {rx=radx; ry=rady;}

void show()

{ellipse(x,y,0,360,rx,ry);}

}

//CIRC.FIGкласс «окружность»

class circ: public figure{

int radius;

public: 

circ(point d, int rad): figure(e) {radius=rad;}

void show()

{circle(x,y,radius);}

}

//PROG8.CPP- главная программа

#include <graphics.h>

#includefigure.cpp

#includecirc.fig

#includeellips.fig

#include <conio.h>

void main(void)

{ point A(100,80), B(300,200);

circ C(A,60);  ellips E(B,200,100);

{ int dr=DETECT, mod;

initgraph(&dr, &mod,c:\\bc\\bgi”);

A.show(); getch();// point::show()

B.show(); getch();// point::show()

C.show(); getch();// circ::show()

E.show(); getch();// ellips::show()

C.move(B); getch();// circ::figure::move()

E.hide(); getch();// ellips::figure::hide()

  C.hide();//circ::figure::hide()

} closegraph();

}

Пример #9. Односвязный список объектов класса figure

Создадим класс CHAIN с указателями

  •  на начальный элемент в списке (begin), 
  •  на последний элемент, уже включенный в список (last),
  •  на следующий элемент списка (next)
  •  на объект абстрактного базового класс figure (pfig)

Параметр конструктора имеет тип указателя на абстрактный базовый класс figure.

В качестве фактических параметров будем использовать ссылки на конкретные объекты классов, производных от абстрактного класса figure.

//PROG9.CPP

#include <stdlib.h> //NULL, malloc

#include <conio.h> //getch()

#include <iostream.h> //cout

#includepoint.cpp

#includefigure.cpp

#includecirc.fig

#includeellips.fig

class chain { static chain *last; chain * next;

public:

 figure *pfig;

static chain *begin;

chain(figure *p);//конструктор

 //функция изображает все фигуры списка

static void showAll(void);};

chain *chain::begin=NULL;

chain *chain::last=NULL;

void chain::showAll(void)

{  chain *uk=begin;

while (uk != NULL)

 { uk->pfig->show();

 uk=uk->next;

 }

}

chain::chain(figure *p)

{ if (begin == NULL)

 begin=this;

else last->next=this;

pfig=p;

next=NULL;

last=this;

}

void main()

{ point A(100,80), B(300,200);

circ C(A,60);

ellips E(B,200,100);

{ int dr=DETECT, mod;

initgraph(&dr, &mod,c:\\bc\\bgi”);

A.show(); getch();// point::show()

B.show(); getch();// point::show()

C.show(); getch();// circ::show()

chain ca(&C);// включить в список circ

E.show();getch();// ellips::show()

chain ce(&E); // включить в список ellips

C.move(B);getch();// circ::figure::move()

E.hide();getch();// ellips::figure:hide()

C.hide();getch();//circ::figure::hide()

// показать все фигуры из списка

chain::showAll(); getch();}

closegraph();

}

Локальные классы

Класс может быть определен внутри тела функции или другого класса. Такой класс называется локальным.

Внутри локального класса разрешено использовать только:

  •  имена типов
  •  статические (static) переменные
  •  внешние (extern) переменные
  •  внешние функции 
  •  элементы перечислений

Локальный класс не может иметь: 

  •  статических (static) данных
  •  переменные автоматической памяти

Их компонентные функции могут быть только встроенными (inline).

Вложенные и локальные классы

В теле класса можно сделать описание другого, вложенного класса. Классы, прописанные в public будут являться вложенными и могут быть доступны через оператор разрешения области видимости::. 

Во вложенном классе можно снова описать вложенный, внутренний класс и т. д. Классы-члены могут быть объявлены статическим модификатором static перед ключевым словом class. Поведение статических классов-членов ничем не отличается от поведения обычных классов, отличается только обращение к таким классам. Все нестатические вложенные классы называются внутренними. В них нельзя объявлять статические члены. 

Класс, определенный внутри тела функции (метода), называется локальным. Локальные классы, как и все локальные переменные, не являются членами класса и не могут быть вызваны извне.

Пример #10. Вложенный класс «отрезок» глобального класса «квадрат»

Опишем квадрат, стороны которого параллельны осям прямоугольной декартовой системы координат, с заданием координаты центра и размера стороны. Внутри класса определи класс отрезок с заданием координат его концов.

#include <conio.h>

#includepoint.cpp

class square //глобальный класс

{ class segment //вложенный класс

{ point pn, pk;

 public:

 segment (point pin=point(0,0),

  point pik=point(0,0))

{pn.givex()=pin.givex();pn.givey()=pin.givey();

pk.givex()=pik.givex();pk.givey()=pik.givey();}

// доступ к граничным точкам отрезка

point& beg(void){return pn;}

point& end(void){return pk;}

//показать отрезок

void showSeg()

{line (pn.givex(), pn.givey(), pk.givex(), pk.givey());}

};

segment ab,bc,cd,da;

public:

 square (point ci=point(0,0), int di=0)

{point a, b, c, d;

a.givex()=ci.givex()-di/2;

a.givey()=ci.givey()-di/2;

b.givex()=ci.givex()+di/2;

b.givey()=ci.givey()-di/2;

  c.givex()=ci.givex()+di/2;

c.givey()=ci.givey()+di/2;

d.givex()=ci.givex()-di/2;

d.givey()=ci.givey()+di/2;

ab.beg()=a; ab.end()=b;

bc.beg()=b; bc.end()=c;

cd.beg()=c; cd.end()=d;

da.beg()=d; da.end()=a;

}

// показать квадрат, состоящий из отрезков

void showSquare(void)

{ ab.showSeg(); bc.showSeg();

 cd.showSeg(); da.showSeg();

}

};

void main()

{ int dr=DETECT, mod;

initgraph(&dr, &mod,c:\\bc\\bgi”);

point p1(80,120);

point p2(250,240);

square A(p1,30);

square B(p2,140);

A.showSquare(); getch();

B.showSquare(); getch();

closegraph();

}


 

А также другие работы, которые могут Вас заинтересовать

82832. Парова машина 555.5 KB
  Першим механічним двигуном що знайшов практичне застосування була парова машина. Спочатку вона призначалася для використання в заводському виробництві але пізніше паровий двигун стали встановлювати на самохідних машинах паровозах пароплавах автомобілях і тракторах.
82833. Перші українські політичні партії 36.72 KB
  Програмовий документ партії проголошував боротьбу проти самодержавства, встановлення парламентського ладу, демократичних свобод та автономії територій, заселених українцями, введення української мови в школах, адміністративних установах.
82834. Особенности проведения ГИС в горизонтальных скважинах 59 KB
  Основные причины различия показаний методов ГИС в вертикальных и сильноискревленных стволах: Влияние пространственного взаиморасположения пласта и скважины Анизотропия свойств. В горизонтальных скважинах проникновения происходит в отдельных проницаемых пропластках непосредственно...
82835. Безработица. Причины образования, последствия 244 KB
  Актуальность темы заключается в том что проблема занятости и безработицы в наши дни становится неотъемлемым элементом жизни России оказывающим существенное влияние не только на социально-экономическую но и на политическую ситуацию в стране.
82836. Генная инженерия 65.36 KB
  Цели создания ГМО продовольственная и сельскохозяйственная организация ООН FO рассматривает использование методов генетической инженерии для создания трансгенных сортов растений либо других организмов как неотъемлемую часть сельскохозяйственной биотехнологии.
82837. Вооруженные силы РФ на современном этапе 162.5 KB
  Конфронтация между Востоком и Западом уступила место партнерству. Наметилась важная позитивная тенденция создания европейской системы коллективной безопасности. Произошли и другие положительные сдвиги.
82838. Функціоналізм в американській психології 112.5 KB
  На відміну від структуралізму, який виник в Європі та поширилася на Сполучені Штати, функціоналізм виник на американському грунті. Однією з передумов його виникнення була дарвінівська теорія еволюції, що опанувала розумами як у Європі, так і в Америці в кінці XIX ст.
82839. Вода в організмі людини: роль і вміст 61 KB
  Кожна жива клітка організму людини містить цілющий водний розчин різних живильних речовин. В цілому організм людини перебуває на 8650 з води 86 у новонародженого і 50 у старого. Значення води в житті людини визначається тими функціями і тією величезною часткою яку вона займає в загальній...
82840. Медицина в средние века 34.72 KB
  В течении всего средневекового периода природа оставалась закрытой книгой. Как доказательство, приводят совершенное отсутствие в средние века гигиены, как в частных жилищах, так и вообще в городах, а так же свирепствования в течение всего этого периода убийственных эпидемии чумы...