fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class Character;
  5. class Human;
  6. class Robot;
  7.  
  8. class Effect {
  9. public:
  10. virtual void apply(Character *c) { }
  11. virtual void apply(Human *c) { }
  12. virtual void apply(Robot *c) { }
  13. };
  14.  
  15. class Character {
  16. public:
  17. virtual void accept(Effect *effect) = 0;
  18. };
  19.  
  20. class Human : public Character {
  21. public:
  22. virtual void accept(Effect *effect)
  23. {
  24. effect->apply(this);
  25. }
  26. };
  27.  
  28. class Robot : public Character {
  29. public:
  30. virtual void accept(Effect *effect)
  31. {
  32. effect->apply(this);
  33. }
  34. };
  35.  
  36. class Fire : public Effect {
  37. public:
  38. virtual void apply(Human *c) { std::cout << "humans burn" << std::endl; }
  39. };
  40.  
  41. class Shock : public Effect {
  42. public:
  43. virtual void apply(Robot *c) { std::cout << "robots get shocked" << std::endl; }
  44. virtual void apply(Human *c) { std::cout << "humans get shocked" << std::endl; }
  45. };
  46.  
  47. class Water : public Effect {
  48. public:
  49. virtual void apply(Robot *c) { std::cout << "robots don't like water" << std::endl; }
  50. };
  51.  
  52. int main()
  53. {
  54. std::vector<Character*> characters;
  55. characters.push_back(new Robot());
  56. characters.push_back(new Human());
  57.  
  58. std::cout << "Fire:" << std::endl;
  59. Effect *fire = new Fire();
  60. for(size_t i = 0;i<characters.size();++i)
  61. {
  62. characters[i]->accept(fire);
  63. }
  64.  
  65. std::cout << "Shock:" << std::endl;
  66. Effect *shock = new Shock();
  67. for(size_t i = 0;i<characters.size();++i)
  68. {
  69. characters[i]->accept(shock);
  70. }
  71.  
  72. std::cout << "Water:" << std::endl;
  73. Effect *water = new Water();
  74. for(size_t i = 0;i<characters.size();++i)
  75. {
  76. characters[i]->accept(water);
  77. }
  78.  
  79.  
  80. // totally leaked some memory
  81. }
Success #stdin #stdout 0.02s 2860KB
stdin
Standard input is empty
stdout
Fire:
humans burn
Shock:
robots get shocked
humans get shocked
Water:
robots don't like water