Віртуальні методи
Згадаймо спочатку, що таке шаблони функцій
Шаблони вводяться для того, щоб автоматизувати створення функцій, що обробляють різнотипні дані. Наприклад, алгоритм сортування можна використовувати для масивів різних типів. При перевантаженні функції для кожного використовуваного типу визначається своя функція. Шаблон функції визначається один раз, але визначення параметрізіруется, т. Е. Тип даних передається як параметр шаблону. Формат шаблону:
Таким чином, шаблон сімейства функцій складається з 2 частин - заголовка шаблону: template<список параметров шаблона> і звичайного визначення функції, в якому замість типу значення, що повертається і / або типу параметрів, записується ім'я типу, певне в заголовку шаблону.
// шаблон функції, яка знаходить абсолютне значення числа будь-якого типу
template
Шаблон служить для автоматичного формування конкретних описів функцій по тим викликам, які компілятор виявляє в програмі. Наприклад, якщо в програмі виклик функції здійснюється як abs (-1.5), то компілятор сформує визначення функції double abs (double x).
Шаблони класів так само як і шаблони функцій підтримують парадигму узагальненого програмування, т. Е. Програмування з використанням типів в якості параметрів. Механізм шаблонів в С ++ допускає застосування абстрактного типу в якості параметра при визначенні класу. Після того як шаблон класу визначено, він може використовуватися для визначення конкретних класів. Процес генерації компілятором визначення конкретного класу за шаблоном класу і аргументам шаблону називається інстанцірованія шаблону.
Визначення шаблонного (родового, узагальненого) класу має вигляд:
template <параметры шаблона>
T x, y; // координати точки
Point (T X = 0, T Y = 0): x (X), y (Y)<>
void Show () const;
Point
Point
У проекті, що складається з декількох файлів, визначення шаблону класу зазвичай виноситься в окремий файл. Але для того, щоб інстанціювати конкретний екземпляр шаблону класу необхідно, щоб визначення шаблону знаходилося в одній одиниці трансляції з цим екземпляром. Тому все визначення шаблонного класу розміщується в заголовки, а потім цей файл підключається до потрібних файлів за допомогою директиви include. Щоб цей файл не включався повторно використовується директива ifndef.
T x, y; // координати точки
Іноді виникає необхідність визначити спеціалізовану версію шаблону для якогось конкретного типу його параметра (або одного з параметрів).
Розглянемо відношення T a template bool Less (T) const; // спеціалізація для char * template <> class Sample bool Less (T) const; Для продовження скачування необхідно зібрати картинку: