fork(1) download
  1. #include <iostream>
  2.  
  3. class BaseObject
  4. {
  5. private:
  6. virtual void v_load() = 0;
  7.  
  8. public:
  9. void load() { v_load(); }
  10. };
  11.  
  12. template<typename Derived>
  13. class Object : public BaseObject
  14. {
  15. private:
  16. virtual void v_load() { static_cast<Derived&>(*this).load(); }
  17. };
  18.  
  19. class Pawn : public Object<Pawn>
  20. {
  21. public:
  22. void load() { std::cout << "Pawn::load()" << std::endl; }
  23. };
  24.  
  25. class BlackPawn : public Pawn
  26. {
  27. private:
  28. virtual void v_load() {
  29. std::cout << "BlackPawn::v_load()" << std::endl;
  30. std::cout << "- "; Pawn::load();
  31. }
  32.  
  33. public:
  34. void load() {
  35. std::cout << "BlackPawn::load()" << std::endl;
  36. std::cout << "- "; Pawn::load();
  37. }
  38. };
  39.  
  40. class BigBlackPawn : public BlackPawn
  41. {
  42. private:
  43. virtual void v_load() {
  44. std::cout << "BigBlackPawn::v_load()" << std::endl;
  45. std::cout << "- "; BlackPawn::load();
  46. }
  47.  
  48. public:
  49. void load() {
  50. std::cout << "BigBlackPawn::load()" << std::endl;
  51. std::cout << "- "; BlackPawn::load();
  52. }
  53. };
  54.  
  55. template<typename T>
  56. void load(T& x)
  57. {
  58. x.load();
  59. }
  60.  
  61.  
  62. void vload(BaseObject& x)
  63. {
  64. x.load();
  65. }
  66.  
  67. int main()
  68. {
  69. Pawn p;
  70. BlackPawn bp;
  71. BigBlackPawn bbp;
  72.  
  73. load(p);
  74. load(bp);
  75. load(bbp);
  76. std::cout << std::endl;
  77. vload(p);
  78. vload(bp);
  79. vload(bbp);
  80. }
Success #stdin #stdout 0s 3348KB
stdin
Standard input is empty
stdout
Pawn::load()
BlackPawn::load()
- Pawn::load()
BigBlackPawn::load()
- BlackPawn::load()
- Pawn::load()

Pawn::load()
BlackPawn::v_load()
- Pawn::load()
BigBlackPawn::v_load()
- BlackPawn::load()
- Pawn::load()