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