АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Абстрактные классы

Читайте также:
  1. Классификация ферментов. Общая характеристика класса трансфераз. Основные подклассы. Коферменты трансферазных реакций.
  2. КЛАССЫ. КОНСТРУКТОРЫ
  3. Производные классы.

Абстрактный класс предназначен для отображения в программе сущностей, которым нет соответствия в реальном мире.

По назначению абстрактные классы можно разделить на:

базовые

интерфейсные

Рисунок: Circle -> Shape <- Triangle

Ближайший кандидат на роль абстрактного класса это Shape из иерархии геометрических фигур. Shape нельзя нарисовать на экране, но этот класс очень полезен при программировании.

Абстрактные классы определяются на основе того, что для них нельзя выполнить некоторые методы.

Абстрактный класс – класс, содержащий хотя бы 1 абстрактный метод.

Абстрактный метод – метод, для которого не задан алгоритм.

class Shape

{ private: int x,y; int color;

public: virtual void Draw()=0; // объявление абстрактного метода };

Виртуальный метод Draw объявлен в составе Shape, но алгоритм для него не задан

Для абстрактных классов невозможно создать объект. Эти классы могут использоваться только как базовые при наследовании. Производный класс для того, чтобы перестать быть абстрактным должен задать алгоритм для абстрактных методов.

Class Circle: public Shape

{ private: int r;

public: virtual void Draw() }

void Circle:: Draw() { //2}

При такой реализации класса окружности можно задавать объекты типа Circle.

В примере показано применение интерфейсного класса как базового. Но с развитием ООП было предложено интерфейсное применение.

Идея плагинов (программных модулей) разработанных независимо от основной программной систем, но имеющих стандартный интерфейс, позволяющий основной системе «подключать» плагины для расширения свой функциональности.

Язык программирования С++ с помощью абстрактных классов напрямую поддерживает идею стандартизованного интерфейса. В этом случае в исходных кодах системы определяется абстрактный класс, который содержит только константы и объявления абстрактных методов. В плагине создаётся объект класса, который унаследован от абстрактного класса основной системы и реализованы все абстрактные модули. Получить ссылку на объект из плагина система может вызывать его методы.


class Device
{ public:

virtual int open(int mode)=0;

virtual int close()=0;

virtual int read(char *p, int n)=0;

virual int write(char *p, int n)=0;

cout READ_ONLY=1;

cout OPEN_SHARE=2; };


Система   Плагин  
Class Devic {}   Class Mouse: public Device {};
Device *p;   Mouse m;
p &m
         

 

 

Таблица виртуальных методов.

Если в базовом классе объявляется виртуальный метод, то в объектах этого класса и производных классов появится дополнительное невидимое поле, которое будет содержать ссылку на фактический алгоритм данного метода.

Используются указатели на функции. Алгоритм каждого метода начинается по определённому адресу в памяти компьютера, и этот адрес запоминается.

Модификацию этого поля производит компилятор при вызове конструктора.

Конструктор вызывается в порядке наследования в базовых производных. Каждый конструктор будет модифицировать это поле. В результате поле будет ссылаться на самый последний алгоритм иерархии классов.

class Shape

{ private: int x,y; int color;

public: virtual void Draw; } ->(*)

внутреннее представление:

Shape c;

int x
int y
int color
void (* _Draw) ();

Void(*_Draw)(); - указатель на функцию. Ссылается на Draw()

(*) Void shape:: Draw() {//1}

class Circle: public Shape

{ private: int r;

public: virtual void Draw(); };

void Circle::Draw()

{ // (2) }

Circle S;

int x
int y
int color
void (*_Draw)()
int r

Замечания:

1.при вызове виртуального метода вызов происходит через указатель в составе объекта (после). Это гарантирует, что вызовется корректный алгоритм, ссылка на который была настроена соответствующими конструкторами.

2.Реальные компиляторы С++ формируют более сложную структуру таких указателей

3.Синтаксис виртуальных методов создаёт дополнительные сложности, которые мы не рассматриваем

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)