Наследование шаблонных классов

Шаблонные классы можно наследовать, как и обычные классы. При использовании указателей важно помнить, что указатель на объект одной специализации нельзя присвоить указателю у которого специализация отличается. Иными словами, указателю на объект типа B<int> нельзя присвоить адрес объекта типа B<double>. Пример наследования шаблонных классов приведен в листинге 15.5.

Листинг 15.5. Наследование шаблонных классов

#include <iostream>
#include <typeinfo>

template<typename T> class A {
public:
   T x;
   A(T a): x(a) {}
   virtual void func();
   virtual ~A() {};
};
// Класс B наследует класс A
template<typename T> class B : public A<T> {
public:
   T y;
   B(T a, T b) : A<T>(b), y(a) {}
   void func();
};

template<typename T>
void A<T>::func() { std::cout << "A::func()" << std::endl; }
template<typename T>
void B<T>::func() { std::cout << "B::func()" << std::endl; }

int main() {
   A<int> *pA, a(30);
   B<int> b(10, 20);
   B<double> c(10.5, 20.3);
   pA = &a;
   pA->func();                                   // A::func()
   pA = &b;
   pA->func();                                   // B::func()
   std::cout << typeid(a).name() << std::endl;   // 1AIiE
   std::cout << typeid(*pA).name() << std::endl; // 1BIiE
   std::cout << typeid(c).name() << std::endl;   // 1BIdE
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов