1 using namespace std; 2 3 class Base { 4 public: name()5 virtual const char* name() { return "Base"; } ~Base()6 virtual ~Base() {} 7 }; 8 9 template <class A1> 10 class A : public Base { 11 public: name()12 virtual const char* name() { return "A"; } funcA(A1 x)13 A1 funcA(A1 x) { return x; } 14 }; 15 16 template <class B1, class B2> 17 class B : public A<B2> { 18 public: name()19 virtual const char* name() { return "B"; } funcB(B1 x,B2 y)20 pair<B1, B2> funcB(B1 x, B2 y) { return pair<B1, B2>(x, y); } 21 }; 22 23 template <class C1> 24 class C : public B<long, C1> { 25 public: name()26 virtual const char* name() { return "C"; } funcC(C1 x)27 C1 funcC(C1 x) { return x; } 28 }; 29 30 template <class D1> 31 class D : public C<pair<D1, D1> > { name()32 virtual const char* name() { return "D"; } 33 }; 34 35 class E : public D<double> { name()36 virtual const char* name() { return "E"; } 37 }; 38