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

}


 

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

37475. Проектирование и конструирование талевого блока газовой скважины 1.12 MB
  5 Диаметр отверстия в стволе ротора мм 700 Расчетная мощность привода ротора кВт 370 Мощность бурового насоса кВт 950 Расчетная мощность на валу буровой лебедки кВт 670 Наибольшая оснастка 5x6 Диаметр каната мм 28 Диаметр шкивов наружный мм 1 шкив 1000; 10 шкивов 900 Максимальная подача бурового насоса л с 50.1 Оснастка талевой системы Порядок прохождения талевого каната через канатные шкивы кронблока и талевого блока имеет существенное значение для распределения нагрузки на ноги вышки и для правильной навивки каната на барабан...
37477. Изучить среду Microsoft Visual Studio 6.0. Изучить структуру программы на языке C++ 1.17 MB
  В язык С были добавлены новые возможности: виртуальные функции перегрузка функций и операторов ссылки константы пользовательский контроль над управлением свободной памятью улучшенная проверка типов и новый стиль комментариев . Его новые возможности включали множественное наследование абстрактные классы статические функциичлены функцииконстанты и защищённые члены. Строка под главным меню содержит панель инструментов полезным свойством которой является выпадающий список функций программы с помощью которого можно быстро...
37478. Метод мурашиних колоній 235.5 KB
  Технічне завдання Розробити програму що здійснює пошук оптимального шляху між двома клітинками ігрового поля яке являє собою двовимірну матрицю клітинок заданого розміру. Пошук шляху повинен здійснюватись за допомогою алгоритму мурашиної колонії параметри алгоритму повинні налаштовуватись користувачем вручну. Пізніше список використовується для визначення довжини шляху між вузлами. Справжня мураха під час переміщення по шляху залишає за собою деяку кількість феромону.
37479. МЕТОДОЛОГИЯ МОДЕЛИРОВАНИЯ ДАННЫХ В СРЕДЕ ERWIN 993 KB
  2] Зависимые и независимые сущности.9] Избыточные сущности [9. На стадии проектирования создаются логические модели трех уровней: Entity Reltion Digrm Диаграмма сущностьсвязь и KeyBsed model Модель данных основанная на ключах и Полная атрибутивная модель Диаграмма сущностьсвязь ERD Entity Reltionship Digrm определяет сущности и их отношения. Модель данных основанная на ключах описывает структуру данных системы в которую включены все сущности и атрибуты в том числе ключевые.
37480. Вступ до філософії. Історико-філософський та релігієзнавчий аспекти 1008.5 KB
  Розкриває зміст світоглядної проблематики та специфіку філософського і релігійного підходів до неї становлення та основні етапи розвитку філософії у звязку з розвитком релігії в країнах європейської культури особливості східних і західних релігійних і філософських традицій основні позиції та філософські аргументи щодо питань про сутність релігії існування Бога відношення моральності і релігії проблеми особистого безсмертя. Християнська релігія та філософське осмислення ідеї Бога Абсолюта від Середньовіччя до початку ХІХ ст. Проблема...
37481. ФІЛОСОФІЯ, її ПОХОДЖЕННЯ, ПРОБЛЕМАТИКА ТА ФУНКЦІЇ 791.5 KB
  Перш за все філософія аналізує людське знання про реально існуючі речі та цікавиться тим ступенем достовірності який може бути тут досягнутий. Дитрих фон Гільдебранд Філософія відрізняється від науки не в тому значенні що апелює до відірваних від життя тверджень а в тому що максимально вірно виражає її зміст. Карл Ясперс Філософія як особлива сфера людського знання і пізнання виникла на основі світоглядних пошуків та орієнтацій людини що постають як необхідність з погляду людського життєвого вибору та самоствердження.
37482. Философия. Учебное пособие 3.03 MB
  Учебнике рассматриваются предмет и метод философской науки, философия как мировоззренческая система, прослеживается эволюция ее основных течений. Важное место отводится человеку в системе философского знания. Особое внимание уделяется проблемам общества и культуры как объектам философского анализа, а также основополагающим ценностям жизни людей.
37483. Философия: Энциклопедический словарь 3.92 MB
  В Словаре включающем более 1500 статей рассматриваются понятия и проблемы современной философии ее главные направления и основные разделы. Большое число статей посвящено истории философии и философам оказавшим существенное влияние на развитие философии и всей общественной мысли. Особое место занимают материалы об отечественной философии и ее наиболее видных представителях. Введены также статьи показывающие взаимосвязь философии с такими науками как социология политология история лингвистика экономическая наука.