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

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

Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
Моделирование вычислительного центра на 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 Декабрь 16 2013 02:17:24 · 0 Комментариев · 6611 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PHP 5. Полное рук...
Шифрование по алг...
Adapter (пример D...
Пример работы с б...
Ранги для форума
Dealer
TsHintManager
Советы от Даниилы...
Фундаментальные а...
Синтаксический ан...
Стелтинг Стивен, ...
Программирование ...
Text effect
Профессиональное ...
Задача о 8ми ладьях
Abc_component
XPmenu
index.php + мод ...
Пример работы с ф...
FreeSMS v1.3.1

Топ загрузок
Приложение Клие... 100751
Delphi 7 Enterp... 97133
Converter AMR<-... 20228
GPSS World Stud... 16951
Borland C++Buil... 14137
Borland Delphi ... 10066
Turbo Pascal fo... 7333
Калькулятор [Ис... 5882
Visual Studio 2... 5189
FreeSMS v1.3.1 3650
Случайные статьи
Сложная схема линк...
Событие OnDragDrop
Возможности окруже...
Блок синхронизации
Абразивная противо...
CN=Configuration, ...
Внешние разъемы на...
Казино 777 vulkan ...
Основы ведения инф...
Анализ вывода муль...
Наследование одино...
Списки
Символы, используе...
Популярные игры в ...
Инструменты раскру...
Рио бет
Воспроизведение ст...
Программы
Строки. Изменение ...
на прилагаемом ком...
Создание и изменен...
Протокол динамичес...
Лайв ставки на киб...
Различные ограничения
Подтверждение реги...
Статистика



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


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