fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4.  
  5. class Animal
  6. {
  7. protected:
  8. int tip;
  9. std::string name;
  10. int age;
  11.  
  12. public:
  13. Animal(int t, std::string n, int a): tip(t), name(n), age(a) {}
  14. virtual ~Animal() {}
  15.  
  16. virtual void print(std::ostream& os) const
  17. {
  18. os << "Name: " << name << std::endl;
  19. os << "Age: " << age << std::endl;
  20. }
  21.  
  22. friend std::ostream& operator<<(std::ostream& os, const Animal& a)
  23. {
  24. a.print(os);
  25. return os;
  26. }
  27. };
  28.  
  29. class Cat : public Animal
  30. {
  31. std::string race;
  32. std::string pref_food;
  33.  
  34. public:
  35. Cat(int t = 0, std::string n = "", int a = 0, std::string r = "", std::string mnprf = ""):
  36. Animal(t, n, a), race(r), pref_food(mnprf) {}
  37.  
  38. void print(std::ostream& os) const override
  39. {
  40. Animal::print(os);
  41. os << "race: " << race << std::endl;
  42. os << "Fav food: " << pref_food << std::endl;
  43. }
  44. };
  45.  
  46. class Dog : public Animal
  47. {
  48. std::string disease;
  49. std::string master;
  50.  
  51. public:
  52. Dog(int t = 1, std::string n = "", int a = 0, std::string b = "", std::string s = ""):
  53. Animal(t, n, a), disease(b), master(s) {}
  54.  
  55. void print(std::ostream& os) const override
  56. {
  57. Animal::print(os);
  58. os << "disease: " << disease << std::endl;
  59. os << "master: " << master << std::endl;
  60. }
  61. };
  62.  
  63. template<typename T>
  64. void add(std::vector<std::shared_ptr<Animal>> &vec, const T &a)
  65. {
  66. auto newptr = std::make_shared<T>(a);
  67. vec.push_back(newptr);
  68. }
  69.  
  70. int main()
  71. {
  72. std::vector<std::shared_ptr<Animal>> Animals;
  73.  
  74. Dog d(1,"Rex", 12, "idk", "Oscar");
  75. Cat c(0,"Meaw", 11, "Sfinx", "Catfood");
  76. add(Animals, d);
  77. add(Animals, c);
  78.  
  79. /* alternatively:
  80.   Animals.push_back(std::make_shared<Dog>(1,"Rex", 12, "idk", "Oscar"));
  81.   Animals.push_back(std::make_shared<Cat>(0,"Meaw", 11, "Sfinx", "Catfood"));
  82.   */
  83.  
  84. for(auto &i: Animals)
  85. {
  86. std::cout << *i;
  87. }
  88.  
  89. return 0;
  90. }
Success #stdin #stdout 0s 4524KB
stdin
Standard input is empty
stdout
Name: Rex
Age: 12
disease: idk
master: Oscar
Name: Meaw
Age: 11
race: Sfinx
Fav food: Catfood