Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП все ответы.doc
Скачиваний:
4
Добавлен:
28.10.2018
Размер:
312.83 Кб
Скачать

32. Шаблоны ф-й

Шаблоны бывают 2 видов:

1)Шаблоны класса

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

зададим шаблон (т.е. образец) функции, а компилятор самостоятельно задаст неск-ко перегруженных ф-й для стольких типов данных, для скольких нам потребуется вызвать шаблон. Данный вар пройдет только в том случае, если реализация алгоритма независима от типа данных. Т.О. область применения перегрузки ф-й и шаблонов отличается: перегрузку ф-й мы применяем для оформления действий, аналогичных по названию, но различных по реализации; а шаблоны для идентичных действий над различными типами.

Шаблон функций определяется следующим образом:

template <class Type> тип_имя ([список параметров]) { //Тело функций }

Идентификатор Type задает параметризованный тип – это фиктивное имя, кот компилятор автоматически заменит именем реального типа данных при создании конкретной версии функций.

В общем случае, шаблон может содержать несколько параметров типа.

<class Type1, class Type2 ………>

Процесс создания конкретной версии функций наз-я инстанцированием шаблона.

Бывает двух видов:

1)явное – заголовки ф-й – все параметризованные типы заменены на конкретные типы, известные в этот момент в программе.

2)неявное – создание экземпляра ф-й происходит автоматически, если встречается фактический вызов ф-и.

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

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

template< class T >

class List

{

/* ... */

public:

void Add( const T& Element );

bool Find( const T& Element );

/* ... */

};

[править]

Использование шаблонов

Для использования шаблона класса, необходимо указать его параметры:

List<int> li;

List<string> ls;

li.Add( 17 );

ls.Add( "Hello!" );

34. Шаблоны. Реализация свойств наследования и полиморфизма.

Синтаксис наследования:

class Base

{

// Описание базового класса

};

class Derived: спецификатор_доступа Base

[,спецификатор_доступа Base2, ...]

{

// Описание производного класса

};

Поля класса при наследования

При создании экземпляра производного класса сначала создаются и инициализируются все поля базового класса, а затем поля, добавленные в производном классе

Логически можно считать, что производный класс агрегирует в себе базовый класс или в производном классе «упакован» базовый класс

Для инициализации полей базового класса используется конструктор базового класса

Конструкторы при наследовании

Как и другие методы конструкторы наследуются, но их использование имеет ряд особенностей

Если в конструкторе производного класса явно не вызывается конструктор базового класса, то компилятор сам вызывает конструктор по умолчанию базового класса

Если необходимо вызвать конструктор базового класса с параметрами, то конструктор указывается в строке инициализации

Тело конструктора базового класса всегда выполняется раньше тела конструктора производного класса

Деструкторы при наследовании

Как и другие методы деструкторы наследуются, но их использование имеет ряд особенностей

Деструктор производного класса не требует явно вызывать деструктор базового класса. В деструкторе производного класса компилятор автоматически генерирует вызовы базовых деструкторов

Тело деструктора производного класса всегда выполняется раньше тела деструктора базового класса

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]