C++. Успадкування шаблонних класів. Додавання нового типу в успадкованих класах


Успадкування шаблонних класів. Додавання нового типу в успадкованих класах

Перед вивченням даної теми рекомендується ознайомитись з наступною темою:

Зміст


Пошук на інших ресурсах:

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();
}

 


Споріднені теми