Успадкування шаблонних класів. Додавання нового типу в успадкованих класах
Перед вивченням даної теми рекомендується ознайомитись з наступною темою:
Зміст
- 1. Загальні відомості про успадкування шаблонів класів
- 2. Приклад. Розширення типу A<TA>, B<TA, TB>, C<TA, TB, TC>
- Споріднені теми
Пошук на інших ресурсах:
1. Загальні відомості про успадкування шаблонів класів
Шаблон класу, який використовує деякий узгальнений тип T, може бути успадкований іншим класом. У найбільш загальному випадку таке успадкування виглядає наступним чином
template <class T> class BaseClass { // ... }; template <class T> class DerivedClass : public BaseClass<T> { // ... };
де
- BaseClass, DerivedClass – відповідно базовий та успадкований шаблони класів, які оперують узагальненим типом T.
Але бувають випадки, коли в похідний клас потрібно ввести додатковий (інший) тип. Таким типом може бути тип, що близький до типу базового класу. Це, наприклад, може бути випадок коли два типи є класами з однієї ієрархії.
В такому разі, код шаблонів базового та похідного класів може мати наступний вигляд:
template <class T> class BaseClass { // ... }; template <class T1, class T2> class DerivedClass : public BaseClass<T1> { // ... };
тут
- BaseClass – базовий клас в ієрархії шаблонних класів який використовує узагальнений тип T;
- DerivedClass – успадкований клас. Цей клас використовує два узагальнені типи T1, T2.
⇑
2. Приклад. Розширення типу A<TA>, B<TA, TB>, C<TA, TB, TC>
У прикладі, з метою демонстрації, використовується додавання нових типів для класів A<TA>, B<TA, TB>, C<TA, TB, TC> які утворюють ієрархію спадковості.
#include <iostream> using namespace std; template <class TA> class A { protected: TA value; public: A(TA value) : value(value) { } void Show() { cout << "A::value = " << value << endl; } TA Get() const { return value; } }; template <class TA, class TB> class B : public A<TA> { private: TB value; public: B(TA valueA, TB valueB) : A<TA>(valueA), value(valueB) { } void Show() { A<TA>::Show(); cout << "B::value = " << value << endl; } TA GetA() const { return A<TA>::value; } TB GetB() const { return value; } }; template <class TA, class TB, class TC> class C : public B<TA, TB> { private: TC value; public: // Конструктор C(TA valueA, TB valueB, TC valueC) : B<TA, TB>(valueA, valueB), value(valueC) { } void Show() { B<TA, TB>::Show(); cout << "C::value = " << value << endl; } TA GetA() const { return A<TA>::value; } TB GetB() const { return B<TA, TB>::value; } TC GetC() const { return value; } }; int main() { B<int, double> objB(10, 5.5); objB.Show(); C<int, float, double> objC(20, 2.5f, 7.3); objC.Show(); }
Споріднені теми
- Шаблон класу. Ключове слово template. Переваги використання шаблонів. Аргументи в шаблонах. Приклади
- Спадковість. Загальні поняття. Використання модифікаторів private, protected, public при успадкуванні
⇑