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

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

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

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

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

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

В качестве иллюстрации выше сказанного рассмотрим пример для расчета площади треугольника и прямоугольника:

// Создание абстрактного класса

# include <iostream.h>

class area

{double dim1, dim2; //размеры фигуры

public:

void setarea(double dim1,double dim2)

{dim1=d1;

dim2=d2;

}

void getdim(double &dim1,double &dim2)

{d1=dim1;

d2=dim2;

}

virtual double getarea()=0; //чистая виртуальная функция

};

class rectangle: public area

{ public:

double getarea()

{double d1,d2;

getdim(d1,d2);

return d1*d2;

}

};

class triangle: public area

{ public:

double getarea()

{double d1,d2;

getdim(d1,d2);

return 0.5*d1*d2;

}

};

int main()

{area *p;

rectangle r;

triangle t;

r.setarea(3.3,4.5);

t.setarea(4.0,5.0);

p=&r;

cout<< “Площадь прямоугольника:”<<p->getarea()<<’\n’;

p=&t;

cout<< “Площадь треугольника:”<<p->getarea()<<’\n’;

return 0;

}

Теперь то, что функция getarea() является чистой виртуальной, гарантирует ее обязательную подмену в каждом производном классе.

4.  Виртуальные классы

При таком наследовании может возникнуть проблема в наследовании двух экземпляров полей класса A в классе D через B и C (будет занята лишняя память и возникнет путаница). Чтобы это избежать, нужно при создании B и C объявить класс виртуальным.

class B : virtual public A

{…}

class C : virtual public A {…}

class D : public C, public B

В этом случае последовательность в создании объектов класса D будет следующей: сначала вызывается конструктор класса А (вызывается один раз), затем конструкторы В и С, последним вызывается конструктор класса D. Уничтожение объектов класса D производится в обратном порядке.

5.  Шаблоны

Шаблоны представляют собой обобщенные объявления, из которых компилятор может создавать функции или классы с заданными параметрами. Шаблоны позволяют пользователям оперировать параметризованными типами. Имея реализацию шаблона, пользователю нет необходимости переписывать функции для конкретных типов данных.

Шаблоны функций

Объявление шаблона функций выглядит следующим образом:

template <список аргументов>

заголовок функции

{тело функции}

Здесь угловые скобки являются неотъемлемым элементом определения. Список параметров шаблона должен быть заключен именно в угловые скобки.

Список аргументов состоит из выражений типа

<class идентификатор 1,…

class идентификатор n>

идентификатор 1, идентификатор n представляют собой обозначения параметризованных типов. Эти обозначения типов можно использовать вместо типов формальных параметров или локальных переменных.

Под классом в данном случае понимается самый обширный тип данных.

Например, шаблон функции обмена для массива будет выглядеть так:

template <class T>

void Obmen(T A[], int i, int j )

{T temp;

temp=A[i];

A[i]=A[j];

A[j]=temp;}

main()

{int Z[10];

Obmen (Z,5,7);

float x[100];

Obmen (x,6,7);

}

Шаблоны функций можно специализировать, т.е. для типов данных, к которым не подходит шаблон, определить функцию с таким же именем. В этом случае алгоритм обращения компилятора к функции будет следующим:

1) Компилятор пытается найти функцию, параметры которой точно соответствуют параметрам вызова.

Если это не удалось, то

2) компилятор пытается найти шаблон, из которого можно сгенерировать функцию с указанными параметрами.

Если и это не удалось, то

3) компилятор рассматривает имеющиеся функции на предмет преобразования типов параметров.

Шаблоны классов

Шаблоны классов задают обобщенные определения семейств классов, использующих произвольные типы и константы. Из шаблона класса компилятор может генерировать объекты с определенными типами и константами.

template <список аргументов>

class NameClass

{ … }

Список аргументов состоит в общем случае из конструкций

< class Ид 1,…

class Ид n ,

тип Ид k… >

Идентификаторы Ид 1 - Ид n используются при определении параметризованных типов.

Идентификатор Ид k используется для задания констант.

Объекты шаблонного класса создаются следующим образом:

NameClass <int> A (список инициализации)

Будет создан объект, где формальные типы будут заменены типом int. Список аргументов модифицируется следующим образом: аргументы вида class Идентификатор заменяется конкретным типом (int, double и т.д.), в том числе здесь можно использовать и классы.

Аргумент вида тип Идентификатор заменяется соответствующей константой.

Шаблоны классов специфицировать нельзя.

Пример использования шаблонов класса:

template <class T>

class TSteck

{int n; T *item;

public:

TSteck(int S=10)

{n=0; item=new T[S];}

void push(T t);

T pop();

}

template <class T>

void TSteck :: push(T t)

{item[n++]=t;}

T TSteck :: pop()

{return item[n--];}

TSteck <float> A(100); // создание объекта

Будет вызван конструктор, и будет моделироваться массив, имитирующий стек.


Информация о работе «Методы программирования в C++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 20279
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
40710
0
0

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

Скачать
8258
0
0

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

Скачать
71422
1
0

... программирование [application programming] — разработка и отладка программ для конечных пользователей, например бухгалтерских, обработки текстов и т. п.   Системное программирование [system programming] — разработка средств общего программного обеспечения, в том числе операционных систем, вспомогательных программ, пакетов программ общесистемного назначения, например: автоматизированных систем ...

Скачать
130405
7
0

... AVR Studio запомнит расположение окон и использует эти установки при следующем запуске проекта. 3.2. Анализ методики реализации разработки программного обеспечения 3.2.1. Классификация вариантов заданий Цель заданий – практическое освоение методики программирования на ассемблере микроконтроллеров ATMEL семейства AVR, отладка программы на симуляторе AVR Studio и программирование кристалла с помощью ...

0 комментариев


Наверх