Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 59263
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

База данных студентов на Turbo Pascal (Списки) + Пояснительная записка
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...
Моделирование информационно-поисковой библиографической системы на gpss ...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

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

Шаблон вполне может наследовать от простого класса. Например, пусть мы хотим, чтобы все классы, сгенерированные из некоторого шаблона, имели общие статические поля и (или) методы. Это можно реализовать как раз путем наследования шаблона от простого класса — такой класс называется независимым базовым классом. Мы должны вынести все общие статические члены в нешаблонный базовый класс, от которого и должен наследовать наш шаблон (листинг 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 16 2013 02:17:24 · 0 Комментариев · 4310 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Progressbar
PHP 5
Пример клиента ФТ...
Самоучитель C++
Sztransppanel
Battle.Net - мони...
Исправление проц...
Delphi 2005 Секре...
Архив значков
Просмотр файлов и...
Цветной Grid
Дарахвелидзе П., ...
Панель Наша Кнопка
С/C++ Программиро...
В.Понамарев - COM...
Последние загруж...
Таймер и секундомер
Pro-Download Sys...
Панель случайной ...
CoolHints2k

Топ загрузок
Приложение Клие... 100511
Delphi 7 Enterp... 89969
Converter AMR<-... 20091
GPSS World Stud... 14756
Borland C++Buil... 12627
Borland Delphi ... 8902
Turbo Pascal fo... 7089
Калькулятор [Ис... 5102
Visual Studio 2... 5017
FreeSMS v1.3.1 3553
Случайные статьи
Необязательные ...
Программы для созд...
Кандидатуры для де...
Известен ли маршру...
IBS Вы можете пред...
Реализация активно...
Программирование а...
Опыт оптимизации
Лабораторное занят...
Обслуживание и под...
Invalid EXTRN defi...
Сертификация специ...
Схема взаимодейств...
Метаданные. Аннота...
Дополнительные воз...
Из записи числа уд...
Протоколы группово...
Метафора
Этот элемент управ...
Организация ядра с...
Динамическое храни...
Подготовка модуля ...
Установка связи в ...
Этот пример являет...
Добавление узлов в...
Статистика



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


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