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

}


 

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

33007. Философия нового времени. Эмпиризм 17.81 KB
  Иной подход к сенсуализму продемонстрировал английский епископ Джордж Беркли 1685 1753. Стремясь защитить религию от идей материализма и атеизма Беркли в работе Трактат об основах человеческого познания 1710 использовал для этого принципы сенсуализма и в результате создал концепцию субъективного идеализма. Каждый предмет полагает Беркли можно определить как комплекс ощущений например яблоко – это собранные воедино определенный вкус цвет форма запах и пр. Все что реально существует дано нам в наших ощущениях и восприятиях...
33008. Рационализм нового времени 24.77 KB
  Рационализм можно понять как уверенность в мощи и способности разума особенно разума просвещённого руководимого правильным методом постигнуть тайны природы познать окружающий мир и самого человека с помощью здравого смысла решать практические жизненные задачи и в конечном счёте построить общество на разумных началах. И непременно с помощью разума постигать Бога. Но и Декарт Спиноза Лейбниц которых считают рационалистами также уделяли немалое внимание чувственному опыту к которому однако относились критически воле и “страстям...
33009. Философия И. Канта 28.93 KB
  Канта 22. Основные достижения философии Канта: 1. Периодизация творчества Имеет место разделение творчества Канта на докритический и критический период.: Кант находится под влиянием Лебница и разрабатывает философию как умозрительное знание.
33010. Философия Фихте и Шеллинга. Основоположения «наукоучения» в философии Фихте. Понятие «абсолютного тождества» в философии Шеллинга 25.61 KB
  Кроме того следует признать недостаточным у Канта и то что он всего лишь только описал формы мышления умственные категории и законы мысли но не выявил основного единого общего принципа познания. Ведь только наличием подобного единого общего принципа познания можно объяснить не только слаженность форм мышления умственных категорий и законов мысли но и само их внутреннее единство между собой.И это есть вопрос не только выявления недостаточности кантовской философии это вопрос концептуальный потому что задача раскрытия данного единого...
33011. Философия Гегеля 23.36 KB
  Введением к гегелевской философской системе служит его Феноменология духа где Гегель рассматривает последовательный ряд развития различных ступеней человеческого сознания от низшей формы непосредственного чувственного восприятия до высшей ступени абсолютного или чистого знания на которой все внешние предметы оказываются полностью преодоленными и дух мыслит только собственную сущность. От бытия понимаемого как явление Гегель переходит к более глубоким внутренним закономерностям к: сущности. Гегель утверждает что противоречие ...
33012. Философия марксизма 18.68 KB
  Дарвина открытие клеточного строения живых организмов изобретение проволочного телеграфа паровоза парохода автомобиля фотографии многочисленные открытия в сфере производства механизация труда; крушение идеалов Великой французской революции свобода равенство братство идеи французского Просвещения их невозможность воплощения в реальной жизни; нарастание социальноклассовых противоречий и конфликтов революция 1848 1849 гг. Суть исторического материализма в следующем: на каждом этапе общественного развития люди для...
33013. Позитивизм и его разновидности 16.86 KB
  Логика и основания развития науки в позитивизме заключались в том чтобы наблюдать описывать и систематизировать факты и на этой основе формулировать научные законы и теории. Современная философия науки начинается с Венского кружка философов участники кот выпустили манифест научное мировоззрение. По мнению неопозитивистов предметом философии д б язык науки а также деятельность философов направленная на анализ знания выраженного в языке науки. культ науки философия должна быть заменена науками в результате логического анализа языка3.
33014. Иррационализм в середине XIX века 14.55 KB
  Они вообще говоря не отвергали науку ее практическое значение для человеческой жизни но отказывались видеть в ней адекватный способ познания окружающего мира и самого человека.Кьергегор на первый план выдвигает проблему человека. Рассмотрим каковы по Кьеркегору методы и способы познания человека. По Кьеркегору никакие научные рациональные методы не годятся для познания человека.
33015. Западноевропейская философия XX века 38.12 KB
  Метод основан на идее специфики философского изучения сознания заключающегося в применении метода интуиции. Метод Эдмунда Гуссерля позволяет философии стать на позиции внутреннего вхождения в поток сознания обеспечивающий возможность непосредственно наблюдать видение структур чистого сознания. Основные формы эмоционального состояния обыденного сознания: забота вина страх ответственность страх смерти и т. В отличие от классических онтологий что как правило рассматривают бытие как объективный независимый от сознания мир Мартин...