Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

Пользователей: 13,368
новичок: Goosprin
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование интернет кафе на GPSS + Отчет
Моделирование автовокзала + Отчет + Блок схема
База данных - словарь терминов на Delphi + Пояснительная записка

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

Шаблон вполне может наследовать от простого класса. Например, пусть мы хотим, чтобы все классы, сгенерированные из некоторого шаблона, имели общие статические поля и (или) методы. Это можно реализовать как раз путем наследования шаблона от простого класса — такой класс называется независимым базовым классом. Мы должны вынести все общие статические члены в нешаблонный базовый класс, от которого и должен наследовать наш шаблон (листинг 11.12).
Листинг 11.12. Наследование шаблона от класса
struct Common
{ static unsigned long Number;
};
template <typename T> class X: public Common {//... }:
unsigned long Common::Number = 0;



Статическое поле Number будет общим для всех классов, инстанцированных из шаблона X.
Наследование шаблона от нешаблонного класса можно использовать в некоторых случаях для решения проблемы «разбухания» кода при инстанцировании шаблонов. Например, нам потребовалась частичная специализация шаблона TStack (см. листинг 11.1) для указателей:
template <class Т> class TStack<T*> { //...
};



При инстанцировании этого шаблона в программе образуется несколько практически одинаковых классов, например:
TStack <int *> i;
TStack <double*> d;
TStack <unsigned long *> ul;



Однако можно существенно сократить объем кода, использовав полную специализацию шаблона и делегирование:
template <> class TStack <void*> // полная специапизация
{ //...
typedef std::size_t size_type;
void push(const void* &t);
void* top();
void pop();
bool emptyO const;
int countO const
};



Эта полная специализация является обычным классом. Частично специализированный шаблон может наследовать от полной специализации, например:
template <class Т>
class TStack<T*>: private TStack<void*> { //...
typedef TStack<void*> TBase;
public:
void push(const T* &t) { TBase::push(t); } void pop() { TBase::pop(t); }
T* top() { return static_cast<T*>(TBase::topO); } //...



В этом шаблоне реализация методов чрезвычайно экономная: метод шаблонного класса вызывает базовый (делегирует работу). Таким образом, имеем существенную экономию объема кода, так как основная реализация выполнена в единственном экземпляре в классе TStack<void*>. Такой подход еще и сокращает время трансляции, так как основной «длинный» класс транслируется только один раз, а наследники — короткие.
Но гораздо интереснее наследование простого класса от шаблона. Вспомним использование статических полей для подсчета объектов класса (см. листинг 4.23). Вставлять в каждый класс поле-счетчик и прописывать код его изменения в конструкторе и деструкторе быстро надоедает — хочется написать код один раз и использовать постоянно.
Программистам важно держать свой компьютер в безопасности - http://itonline.kz/katalog/programmy/antivirusy/dr-web/.

Наследование от общего базового класса, в котором реализован подсчет объектов, не решает проблемы, так как унаследованное статическое поле единственное для всех наследников. Таким образом, выполняется подсчет объектов не каждого класса, а всех объектов иерархии.
Опубликовал Kest December 15 2013 22:17:24 · 0 Комментариев · 6960 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Экранная лупа
Converter AMR<->W...
Анимированное поя...
Просмотр коммент...
Карта сайта
NotePad Pro [Исхо...
Определние размер...
DragMe [Исходник ...
CABfiles
RSS Feeds
PDA версия сайта
Просмотр файлов и...
Архив значков
Работа с матрицами
index.php + мод ...
Java Server Pages...
Самоучитель PHP 4
Панель Календарь
Пример OpenGL гра...
iComm v.6.1 - выв...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97833
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
У типичного руково...
Игровые слоты кази...
Классы C++
Работа для студентов
Блок try–except
Мобильная версия A...
РЕШЕНИЕ: ИМЕНОВАНИ...
Глава 3. Классы
Реализация адресац...
7.7. Сортировка
Панель инструменто...
6.9. Ввод и вывод...
Протокол Х.21 - чт...
Это разрешение буд...
5.1. От псевдокода...
Экземпляры элемент...
Малая вирусная энц...
Металлические диваны
Построение двусвяз...
Базовые файловые с...
Уравнения состояния
Порядок в базе данных
Туннельный режим I...
Алгоритм LZW
Ламбда-подъем с ис...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?