Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 63010
Имитационное мо... 58334
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

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

Файл записей с выводом обратного заголовка на Turbo Pascal
База данных - словарь терминов на Delphi + Пояснительная записка
Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...

Реклама



Подписывайся на 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 Комментариев · 3954 Прочтений · Для печати

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


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



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 для "чайников"
TrayIcon
Библия хакера 2 К...
Аватары в комме...
Измерение тактово...
VFW
CLR via C#
Иллюстрированный ...
EditButton
Последнее загруж...
MicroGPSS Studen ...
Самоучитель Прогр...
Панель для реклам...
PHP 5 на примерах
Доступа к БД Fire...
ADVstatusbar
UmEdit
Мониторинг сервер...
Delphix Sample [И...
DS_Group

Топ загрузок
Приложение Клие... 100479
Delphi 7 Enterp... 87863
Converter AMR<-... 20082
GPSS World Stud... 13497
Borland C++Buil... 12055
Borland Delphi ... 8668
Turbo Pascal fo... 7048
Visual Studio 2... 5005
Калькулятор [Ис... 4908
FreeSMS v1.3.1 3545
Случайные статьи
Платформа Mac
Если RF-кабель при...
— обновления серти...
Таблица помогает с...
Хакинг игровых при...
Xbox открыта и Вы ...
Планирование имита...
Чтобы защитить рек...
Официальный сайт к...
Record variable ex...
В структуре Window...
Стратегия тестиров...
15.1. Слова
Зашифрованный ключ...
Оставшиеся проблем...
Просмотр содержимо...
службами, архивиро...
8.3. Модель трас...
Вам захотелось чег...
Пятнашки на Strawb...
БЛОКИ, СВЯЗАННЫЕ С...
Это позволит приме...
Общие сведения о р...
Создание документа...
Модерация отзывов
Статистика



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


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