Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
9
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

40. Шаблоны классов и наследование.

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

- шаблон класса может быть порожден от обычного класса;

- шаблонный класс может быть производным от шаблонного класса;

- обычный класс может быть производным от шаблона класса.

Ниже приведен пример простой программы, демонстрирующей наследование шаблонного класса oper от шаблонного класса vect.

#include "iostream.h"

template <class T>

class vect // класс-вектор

{protected:

T *ms; // массив-вектор

int size; // размерность массива-вектора

public:

vect(int n) : size(n) // конструктор

{ ms=new T[size];}

~vect(){delete [] ms;} // деструктор

T &operator[](const int ind) // доопределение операции []

{ if((ind>0) && (ind<size)) return ms[ind];

else return ms[0];

}

};

template <class T>

class oper : public vect<T> // класс операций над вектором

{ public:

oper(int n): vect<T>(n) {} // конструктор

~oper(){} // деструктор

void print() // функция вывода содержимого вектора

{ for(int i=0;i<size;i++)

cout<<ms[i]<<' ';

cout<<endl;

}

};

void main()

{ oper <int> v_i(4); // int-вектор

oper <double> v_d(4); // double-вектор

v_i[0]=5; v_i[1]=3; v_i[2]=2; v_i[3]=4; // инициализация int

v_d[0]=1.3; v_d[1]=5.1; v_d[2]=.5; v_d[3]=3.5; // инициализация double

cout<<"int вектор = ";

v_i.print();

cout<<"double вектор = ";

v_d.print();

}

Как следует из примера, реализация производного класса от класса- шаблона в основном ничем не отличается от обычного наследования.

41. Шаблоны. Инстанцирование шаблонов и спецификация шаблонов

Инстанцирование - это прямое или динамическое создание экземпляра класса. В отличие от слова «создание», применяется не к объекту, а к классу. То есть, правильным будет выражение: «создать экземпляр класса (объект) или инстанцировать класс».

Инстанцирование шаблонов судя по всему есть полиморфное инстанцирование. Пример: vector<int> a; Остается неясным обязательна ли при инстанцировании аллокация.

Инстанцирование бывает явное и неявное.

Неявное инстанцирование (implicit) (до и после):

int main()

{

Z<int> zi; // генерация класса Z<int>

Z<float> zf; // генерация класса Z<float>

return 0;

}

----------------------------------------------------------------------

int main()

{

Z<int> zi; // генерация класса Z<int>

zi.f(); // генерация функции Z<int>::f()

Z<float> zf; // генерация класса Z<float>

zf.g(); // генерация функции Z<float>::g()

return 0;

}

Явное инстанцирование (explicit):

int main()

{

// генерация класса Z<int> и функции Z<int>::f()

template class Z<int>;

// генерация класса Z<float> и функции Z<float>::g()

template class Z<float>;

return 0;

}

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

template<class T> class vector {

T* v;

int sz;

public:

vector(int);

T& operator[](int);

T& elem(int i) { return v[i] }

// ...

};