- •ШАБЛОНЫ ФУНКЦИЙ И КЛАССОВ
- •Шаблоны функций
- •Все описания шаблонов функций начинаются с ключевого слова template, за котором следует
- •Формальные параметры в описании шаблона используются (наряду с параметрами встроенных типов или типов,
- •Далее, за этим заголовком, следует обычное описание функции.
- •int main() {
- •PrintArray(a,aCount);
- •Шаблоны функций расширяют возможности многократного использования программного кода.
- •Перегрузка шаблонных функций
- •Алгоритм компилятора при работе с перегруженными шаблонами функций:
- •3) если такого шаблона нет, то выводится сообщение об ошибке.
- •PrintArray(a,aCount); //генерируется шаблонная функция void PrintArray(const int* array, const int count) на основе
- •PrintArray(c,cCount); // вызывается нешаблонная функция void PrintArray(char* array, const int count)
- •Шаблоны классов
- •Процесс генерации компилятором определения конкретного класса по шаблону класса и
- •public:
- •Пример. Шаблон класса список
- •void AddElem(type *d); bool RemoveElem(type *d); void DisplayList();
- •else {
- •T p[elements]; int count;
- •Особенности применения наследования
- •1.От каждого класса произвести потомка с перекрытой соответствующей функцией. В этом случае программа
- •class B
- •Пример. Определение класса – потомка шаблонного класса
- •Шаблоны и наследование связаны друг с другом следующим образом:
- •Шаблоны и друзья
- •Шаблоны и статические члены
- •Пример. Статическое поле в шаблоне класса
- •int main() {
Особенности применения наследования
шаблонных классов
Например, есть несколько сходных классов, необходимо перекрыть одну (или несколько) виртуальную функцию.
Подразумевается, что данные базовые классы логически связаны, т.е. перекрываемая виртуальная функция выполняет одинаковое для всех классов действие, например, возвращает координату объекта.
Эту проблему можно решить двумя способами.
1.От каждого класса произвести потомка с перекрытой соответствующей функцией. В этом случае программа будет работать корректно, но в ней будет присутствовать дублирование кода в нескольких классах.
2.Использование шаблона.
Пример. Определение шаблона класса
class A { public:
virtual void print(){ printf("A::print()\n"); } void f(){printf("A::f()\n");}
};
class B
{
public:
virtual void print(){ printf("B::print()\n"); } void f(){printf("B::f()\n");}
};
class C
{
public:
virtual void print(){ printf(“C::print()\n"); } void f(){printf(“C::f()\n");}
};
template<class T> class D : public T { public:
virtual void print(){ printf("D::print()\n"); }
};
int main() { D<A> a1;
a1.print(); a1.f(); D<B> b1;
b1.print(); b1.f(); D<C> c1;
c1.print(); c1.f(); return 0;
}
Пример. Определение класса – потомка шаблонного класса
class A { public:
void calc(){}
};
template<class T> class B : public T { public:
void print(){}
};
class C : public B<A> { public:
void anyfunc(){}
};
int main()
{
C c; c.print(); c.anyfunc(); c.calc(); return 0;
}
Шаблоны и наследование связаны друг с другом следующим образом:
-шаблон класса может быть производным от шаблонного класса;
-шаблон класса может являться производным от нешаблонного класса;
-шаблонный класс может быть производным от шаблона класса;
-нешаблонный класса может быть производным от шаблона класса.
Шаблоны и друзья
Для шаблонов классов могут определены отношения дружественности.
Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией членом другого класса (возможно, шаблонного класса) или целым классом (возможно, шаблонным классом).
Синтаксическое оформление отношений дружественности в случае шаблонов классов достаточно сложно.
Шаблоны и статические члены
Каждый шаблонный класс, полученный из шаблона классов, имеет собственную копию каждого статического члена данных шаблона; все экземпляры этого шаблонного класса используют свой статический член данных.
Статические члены данных шаблонных классов должны быть инициализированы в области действия файла.
Каждый шаблонный класс получает собственную копию статической функции-члена шаблонного класса.
Пример. Статическое поле в шаблоне класса
template<class T> class A
{
public: static int a;
};
template<class T> int A<T>::a=10;