Переопределения доступа с помощью объявления 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; просмотров: 1428;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.