Переопределения доступа с помощью объявления using
Using пока присутствует не во всех реализациях С++. Используется, когда базовый класс указан с атрибутом наследования private или protected, его методы или переменные являются private. Тогда надо в производном классе указать например так:
class Student: private String, private ArrayDb
{
public:
using ArrayDb::Average;
using ArrayDb::operator[];
}
Average, operator[] были public – методами ArrayDb, но они стали private. Чтобы вернуть их в public – выполним вышеуказанное объявление. Если using не поддерживается, то можно это же сделать так:
class Student: private String, private ArrayDb
{
public:
ArrayDb::operator[];
}
Последний используется в старых реализациях С++.
Шаблоны (параметризация) классов
Шаблоны обеспечивают параметризированые типы данных. Это ещё один вид полиморфизма – полиморфизм параметризованных типов данных. Задаётся схема функции или класса. Когда задаётся значения параметров, то определяется действительно конкретная функция определённого типа или класс.
(Параметризованные функции – просмотреть самостоятельно, но в экзамен они не входят)
Шаблон указывается так:
template<class_Type> {декларация класса|реализация класса}
class_Type – это список пар, разделённых запятыми.Декларация класса и реализация класса выглядят точно так, как это делается для обычных классов, - первое слово class или typename (в более поздних версиях компилятора), а второе пользовательское имя, позволяющее ссылаться к типу или к объекту данных, далее все как обычно.
Пример
template<class Type> class Stack
{
private:
enum {MAX = 10};
Type items[MAX];
int top;
public:
Stack();
bool isempty();
...
bool push(const Type& item);
bool pop(Type &item);
};
template<class Type>
Stack<Type>::Stack()
{top = 0;}
template<class Type>
bool Stack<Type>::isempty()
{return top ==0;}
template<class Type>
bool Stack<Type>::push(const Type& item)
{
if (top<MAX)
{
items[top++] = item;
return true;
}
else return false;
}
template<class T> void simple(T t){cout<<t<<'\n';}//декларация шаблона класса
//не метод класса
Использование шаблонов в программе
Stack <int> kernels;//стек для данных типа int, переменная kernels
Stack <String> colonels; //стек для объектов класса String
simple(2);//simple(int)
simple(“two”);//simple(char*)
В качестве типов возможны и указатели, напр. Stack<char*> st, но нужна тщательная разработка методов во избежание ошибок.
Пример
template <class T, int n>
class ArrayTP
{
private:
T arr[n];
public:
...
explicit ArrayTP(const T &v);
};
Создание класса:
ArrayTP<double,12> eggweights;
Если для некоторого параметра указан конкретный тип, как выше int n, то в качестве аргумента надо использовать сллвеьсвующую константу этого типа, или типа который к ней приводится или выражение этого типа. Но на выражения налагаются некоторые ограничения связанные с поддержкой определённого контроля.
В DevStudio имеется стандартная библиотека шаблонов для работы с совокупностями объектов: CArray, CList, CMap. 1-е два с двумя параметрами-типами, а 3-й с 4-мя параметрическими типами.
Имеются и классы для работы с совокупностями без параметров: типобезопасные и потенциально опасные, для которых заранее нельзя определить тип элементов. При выборе тех или иных шаблонов надо учитывать и то, что для некоторых есть реализация сериализации (сохранение/загрузка) объектов, а для некоторых нет.
Дата добавления: 2016-05-26; просмотров: 1509;