fork download
  1. #include <iostream>
  2.  
  3. class Creature
  4. {
  5. public:
  6. Creature(const std::string& name) : name(name) {}
  7.  
  8. virtual ~Creature() = default;
  9. virtual void printInfo() const
  10. {
  11. std::cout << name;
  12. };
  13.  
  14. std::string name;
  15. };
  16.  
  17. template <typename T>
  18. class VampiredCreature : T
  19. {
  20. public:
  21. VampiredCreature(const T& t, float sunlightSensitivity)
  22. : T(t),
  23. sunlightSensitivity(sunlightSensitivity) {}
  24.  
  25. void printInfo() const override
  26. {
  27. T::printInfo();
  28. std::cout << " vampired: " << sunlightSensitivity;
  29. };
  30. float sunlightSensitivity = 0.f;
  31. };
  32.  
  33. template <typename T>
  34. class WereWolfCreature : T
  35. {
  36. public:
  37. WereWolfCreature(const T& t, int wolfHours) : T(t), wolfHours(wolfHours) {}
  38.  
  39. void printInfo() const override
  40. {
  41. T::printInfo();
  42.  
  43. std::cout << " wereWolf: " << wolfHours;
  44. }
  45. int wolfHours;
  46. };
  47.  
  48. using Vampire = VampiredCreature<Creature>;
  49. using Werewolf = WereWolfCreature<Creature>;
  50. using VampireWerewolf = WereWolfCreature<Vampire>;
  51.  
  52. int main()
  53. {
  54. Creature bob("Bob");
  55. Vampire dracula({"Dracula"}, 0.42f);
  56. Werewolf wolf({"Mi-Wolf"}, 50);
  57. VampireWerewolf vampireWereWolf({{"Wolf/Vampire"}, 0.51f}, 36);
  58.  
  59. bob.printInfo();
  60. std::cout << "\n-----------\n";
  61. dracula.printInfo();
  62. std::cout << "\n-----------\n";
  63. wolf.printInfo();
  64. std::cout << "\n-----------\n";
  65. vampireWereWolf.printInfo();
  66. std::cout << "\n-----------\n";
  67. }
  68.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
Bob
-----------
Dracula vampired: 0.42
-----------
Mi-Wolf wereWolf: 50
-----------
Wolf/Vampire vampired: 0.51 wereWolf: 36
-----------