#include <iostream>
 
using namespace std;
 
class Base {
public:
    virtual ~Base() {}
    virtual void func1() {}
    virtual void func2() {}
    virtual void func3() {}

};
 
template<class B> class Derived1 : public B {
public:
    virtual void func1() {
        cout << "Derived1" << endl;
    }
};
 
template<class B> class Derived2 : public B {
public:
    virtual void func2() {
        cout << "Derived2" << endl;
    }
};
 
template<class B> class Derived3 : public B {
public:
    virtual void func3() {
        cout << "Derived3" << endl;
    }
};

typedef Derived1<Derived2<Base> > Foo;
typedef Derived2<Derived3<Base> > Qoo;
typedef Derived1<Derived1<Base> > Hoo;

int main() {

    Base *foo = new Foo;
    foo->func1();
    foo->func2();
    foo->func3();  // do nothing
    cout << "---------" << endl;
    
    Base *qoo = new Qoo;
    qoo->func1();  // do nothing
    qoo->func2();
    qoo->func3();
    cout << "---------" << endl;
    
    Base *hoo = new Hoo;
    hoo->func1();  // output once
}