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

}


 

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

22742. Етапи війни США у Кореї 82 KB
  Етапи війни США у Кореї. Поэтому сейчас взрывы в Японии рассматривались как начало атомного шантажа США. Эта ошибка в переоценке своих сил вынудили США заплатить за нее очень дорого сначала в Корее а затем во Вьетнаме. Дело состояло в следующем: СССР допустив США в Корею справедливо считала что американцы в свою очередь выделят СССР зону оккупации в Японии.
22743. Основні напрямки зовнішньої політики США на початку 70-х рр 31 KB
  Зайнявши Білий дім 37й американський президент уже в липні 1969 року проголосив нову стратегію США у в'єтнамській війні яка отримала назву доктрини Ніксона . Вже в червні 1969 року почалася евакуація півмільйонного американського контингенту з Південного В'єтнаму. На травень 1972 року тут залишалось 69 тисяч американців. на думку деяких істориків змусило Ханой підписати у Парижі 27 січня 1973 року угоду про припинення військових дій та відновлення миру у В'єтнамі .
22744. Посилення холодної війни США проти соціалістичних країн у період першого президентства Д. Ейзенхауера 31 KB
  Посилення холодної війни США проти соціалістичних країн у період першого президентства Д. Они пожинали плоды послевоенного экономического подъема когда материальное благополучие США еще больше возросло. В 60е годы политизированное студенчество выступило против международной роли США особенно в разрушительной войне во Вьетнаме. Сама жизнь подводила граждан США к поискам нового социального равновесия в стране.
22745. Африканська політика адміністрації Дж. Картера 26.5 KB
  Киссинджер пытались наладить отношения с будущими партнёрами национальноосвободительными силами на юге Африки которые стремились расширить круг своих сторонников на международной арене использовать противоречия международного сообщества с Южной Родезией ЮАР и с колониальными властями Португальской Африки. В частности во время поездки по странам Африки в апрелемае 1976г. Киссинджера в ходе его поездки по странам Африки как прямое указание к действиям. Весомым практическим результатом этой политики для Африки стали посреднические усилия...
22746. Умисел як форма вини 128.5 KB
  Вина - це завжди умисел або необережність. Лише за наявності вини особи щодо вчиненої нею дії (бездіяльності) можна говорити про склад злочину як підставу кримінальної відповідальності.
22747. Доктрина Ейзенхауера 22 KB
  €œДоктрина Ейзенхауера€. У боротьбі за крісло у Білому домі Дуайт Ейзенхауер використав нову зовнішньополітичну доктрину замінивши політику стримування політикою відкидання звільнення ' від комунізму її теоретиком був Дж.Кеннана що у зовнішніх справах Ейзенхауер був людиною гострого політичного розуму і передбачуваності. Президент зазнав нищівної критики військові вимагали збільшення фінансування на звичайні озброєння але Ейзенхауер вистояв.
22748. Політика США щодо СРСР у першій половині 80-х рр 27.5 KB
  Політика США щодо СРСР у першій половині 80х рр. У зовнішньополітичній діяльності президента Рейгана варто розрізнити два періоди відповідно до термінів президентства: 19811984 рокичас різкої конфронтації з СРСР курсу на військову перевагу США у світі домінування силових методів у розв'язанні міжнародних конфліктів дії доктрини Рейгана доктрини неоглобалізму тобто протистояння з СРСР у будьякому куточку планети; 19851989 рокиперіод пошуку шляхів для виходу із політики глобального протистояння з СРСР нормалізації...
22749. Зрив США Паризької наради у верхах у 1960 р 25 KB
  обследовав сверхсекретные объекты Советского Союза Семипалатинский ядерный полигон авиабазу стратегических бомбардировщиков Ту95 близ него полигон противоракетной обороны в СарыШагане ракетный полигон ТюраТам космодром Байконур U2 выскользнул из пределов СССР южнее города Мары. Отмолчались и продолжили планирование разведывательных полетов над СССР. Дело в том что в мае должно было состояться совещание большой четверки США СССР Великобритании и Франции в Париже где предстояла новая встреча главы американского государства с...
22750. Теоретичні основи зовнішньої політики адміністрації Р. Рейгана 30.5 KB
  У зовнішньополітичній діяльності президента Рейгана варто розрізнити два періоди відповідно до термінів президентства: 19811984 рокичас різкої конфронтації з СРСР курсу на військову перевагу США у світі домінування силових методів у розв'язанні міжнародних конфліктів дії доктрини Рейгана доктрини неоглобалізму тобто протистояння з СРСР у будьякому куточку планети; 19851989 рокиперіод пошуку шляхів для виходу із політики глобального протистояння з СРСР нормалізації стосунків з СРСР підписання кардинальних договорів щодо...