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

}


 

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

35794. Кружка. Творческий проект 158.5 KB
  4 Технологическая карта № детали № операции Название операции Эскиз Инструмент и приспособления 1 1 Выбрать заготовку с учётом припуска на обработку Линейка 2 Прострогать базовую сторону Верстак рубанок 3 Разметить и прострогать заготовку по толщине Линейка рубанок карандаш 4 Разметить и прострогать по ширине Линейка рубанок карандаш 5 Отторцевать заготовку Угольник карандаш подкладка 6 Разметить и отпилить заготовку по длине Верстак линейка угольник карандаш ножовка 7 Разметить заготовку по чертежу Линейка угольник карандаш...
35795. Вышивка своими руками. Творческий проект 1.18 MB
  Вышивание крестом один из самых распространенных видов народного искусства. История возникновения вышивки крестом уходит далеко в глубь веков когда появился первый стежок сделанный первобытными людьми при скреплении шкуры убитого мамонта. Материалом для вышивки крестом служили: жилы животных нити льна хлопка конопли шелка шерсти а так же применяли натуральный волос. Особой популярности вышивка крестом достигла в Западной Европе в XVI столетии.
35796. Метод проектів на уроках трудового навчання (обслуговуюча праця) 461 KB
  Проектна технологія — практика особистісно зорієнтованого трудового навчання в процесі конкретної навчально-трудової діяльності учня, на основі його вільного вибору та з урахуванням інтересів. У свідомості учня це має такий вигляд: «Я знаю, для чого мені потрібно все, що я пізнаю, і де я можу ці знання застосувати». Для педагога це прагнення знайти розумний баланс між академічними і прагматичними знаннями, уміннями та навичками.
35797. ”Садово-городній інвентар” Прилад для виготовлення живильних горщиків 565.5 KB
  КОНСТРУКТОРСЬКИЙ ЕТАП Розробка конструкції прилада для виготовлення живильних горщиків. 8 Технологія виготовлення виробу ТЕХНОЛОГІЧНИЙ ЕТАП ЗАКЛЮЧНИЙ ЕТАП. Метою проекту є створення приладу для виготовлення живильних горщиків який здатен задовольнити попит найвибагливіших споживачів.
35799. Садово-огородній інвентар 9.92 MB
  ОРГАНІЗАЦІЙЙНО-ПІДГОТОВЧИЙ ЕТАП Крапельне зрошення: історія і сьогодення Популярність цього методу зростає а разом з цим виникають нові запитання зацікавлені читачі прагнуть більш повного детального розгляду цієї технології. Винахідник крапельного зрошення О. Перші досліди із крапельним зрошенням к. Проте обмеженість водних ресурсів непридатність інших методів зрошення через високу мінералізацію води в цій країні змусили науковців “землі обітованоїâ€ подолати цю проблему і вже в 60ті роки було запатентовано першу систему...
35800. Творчий проект на тему: “Вишивка у інтер’єрі” 371 KB
  Обґрунтування виробу кращої ідеї для реалізації проекту на основі проведених досліджень. Створення клаузори виробу. Визначення отриманої технології виготовленого виробу. Складання технологічної картки виготовлення виробу.
35801. Виготовлення сумки. Творчий проект 1.94 MB
  Виходячи з призначення проектованого виробу та його особливостей сумка повинна мати естетичний вигляд матеріали повинні бути екологічно чисті та нешкідливі як для дорослих та і для дітей.3 Вимоги до конструкції виробу Речі з яких виготовляється сумка повинні забезпечувати безпечність при користуванні.3 Підбір та аналіз матеріалів для виготовлення виробу.
35802. Виготовлення підсвічника. Творчий проект 269.5 KB
  Види будова і властивості деревини Деревина це матеріал одержуваний зі зрубаного і очищеного від кори й галузей стовбура дерева. Навесні клітки дерева менш щільні й міцні рання деревина чим улітку й восени пізня деревина; крім того перші більше світлого кольору. Спелодревесние: ялина ялиця червоний бук липа; у цих дерев деревина не ділиться на ядро і заболонь але внутрішні шари більш міцні і стиглі як і у ядерна порода. Чим більше щільність тим деревина міцніше важче і твердіше але тим складніше її обробка.