fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Base {
  6. public:
  7. virtual ~Base() {}
  8. virtual void func1() {}
  9. virtual void func2() {}
  10. virtual void func3() {}
  11.  
  12. };
  13.  
  14. template<class B> class Derived1 : public B {
  15. public:
  16. virtual void func1() {
  17. cout << "Derived1" << endl;
  18. }
  19. };
  20.  
  21. template<class B> class Derived2 : public B {
  22. public:
  23. virtual void func2() {
  24. cout << "Derived2" << endl;
  25. }
  26. };
  27.  
  28. template<class B> class Derived3 : public B {
  29. public:
  30. virtual void func3() {
  31. cout << "Derived3" << endl;
  32. }
  33. };
  34.  
  35. typedef Derived1<Derived2<Base> > Foo;
  36. typedef Derived2<Derived3<Base> > Qoo;
  37. typedef Derived1<Derived1<Base> > Hoo;
  38.  
  39. int main() {
  40.  
  41. Base *foo = new Foo;
  42. foo->func1();
  43. foo->func2();
  44. foo->func3(); // do nothing
  45. cout << "---------" << endl;
  46.  
  47. Base *qoo = new Qoo;
  48. qoo->func1(); // do nothing
  49. qoo->func2();
  50. qoo->func3();
  51. cout << "---------" << endl;
  52.  
  53. Base *hoo = new Hoo;
  54. hoo->func1(); // output once
  55. }
Success #stdin #stdout 0.01s 2860KB
stdin
Standard input is empty
stdout
Derived1
Derived2
---------
Derived2
Derived3
---------
Derived1