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();

}


 

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

66. Місце і роль соціального захисту населення України 39.61 KB
  Соціальна політика держави покликана забезпечити громадянам гарантовані Конституцією України права: на життя, безпечні умови праці, винагороду за працю, захист сім’ї, відпочинок, освіту, житло, охорону здоров’я та медичну допомогу, соціальне забезпечення та сприятливе навколишнє середовище.
67. Особенности расчёта налога на добавленную стоимость экспортных и импортных операций 44.05 KB
  Выявление особенностей применения налоговых вычетов. Особенности исчисления НДС при ввозе продукции. Применение налоговых вычетов при осуществлении экспортных операций. Особенности вычета НДС при импорте работ и услуг.
68. Здоровий спосіб життя. Виховний захід 42 KB
  Спонукати учнів до аналізу способу життя свого та своєї родини, викликати бажання вести здоровий спосіб життя. Стан повного фізичного, духовного та соціального благополуччя, здоров’я (фізичне і моральне).
69. Русский язык и культура речи. Ступени овладения литературным языком 44.71 KB
  Для низшего уровня, для первой ступени овладения литературным языком достаточно правильности речи, соблюдения норм русского литературного языка. Существуют нормы лексические, орфоэпические (фонетические), грамматические – словообразовательные, морфологические, синтаксические.
70. Учет и контроль материальных запасов бюджетных учреждений 49.1 KB
  Теоретические основы учета и контроля использования материальных запасов в бюджетных учреждениях. Организация учета и контроля использования материальных запасов на примере муниципального бюджетного учреждения Центральная районная больница Миякинского района республики Башкортостан
71. Анализ состояния компьютерного обеспечения ООО ПФ Логос 43.51 KB
  Разработка тренажерных технологий, приобретение необходимых практических умений и навыков в области программирования и обработки данных. Овладения приемами разработки программных продуктов для автоматизированных систем обработки информации и управления.
72. Международные отношения России и Турции 45.25 KB
  Российско-турецкие отношения насчитывают более чем пятисотлетнюю историю. Это история военного соперничества за обладание территориями на Кавказе, Ближнем Востоке, Балканах, за политическое влияние в Европе и странах Ближнего Востока.
73. Природно-ресурсный потенциал России и Мурманской области 49.95 KB
  Анализ обеспеченности России и Мурманской области природными ресурсами. Исчерпаемые, в том числе возобновимые (растительность, запас питательных веществ в почве, запас воды в реках и озерах, годовой и подземный сток, растительный и животный мир) и невозобновимые (минеральные ресурсы, подземные воды, почвенный слой).
74. Управление маркетингом на предприятии Цифрал-Срвис 835 KB
  Миссия компании Цифрал-Срвис заключается в деятельности на благо общества и выражается в предоставлении высококачественных услуг в сфере обеспечения безопасности. Товар поставляется только в подъезды имеющие аудиодомофонное оборудование.