fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <memory>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. class pet {
  9. string name_;
  10. protected:
  11. string name() const { return name_; }
  12. virtual void do_make_sound() const = 0;
  13. public:
  14. pet(const char* name) : name_(name) {}
  15. virtual ~pet() { cout << name() << " dctor." << endl; }
  16. void make_sound() const { do_make_sound(); }
  17. };
  18.  
  19. class dog : public pet {
  20. protected:
  21. virtual void do_make_sound() const { cout << name() << ": わんわんおー" << endl; }
  22. public:
  23. dog(const char* name) : pet(name) {}
  24. };
  25.  
  26. class cat : public pet {
  27. protected:
  28. virtual void do_make_sound() const { cout << name() << ": にゃんにゃんおー" << endl; }
  29. public:
  30. cat(const char* name) : pet(name) {}
  31. };
  32.  
  33.  
  34.  
  35. int main()
  36. {
  37. vector<shared_ptr<pet>> pets;
  38.  
  39. vector<shared_ptr<cat>> cats;
  40. cats.push_back(make_shared<cat>("タマ"));
  41. cats.push_back(make_shared<cat>("ミケ"));
  42. cats.push_back(make_shared<cat>("Kitty"));
  43. for_each(cats.begin(), cats.end(), [](shared_ptr<cat> pet) {pet->make_sound(); });
  44. {
  45. vector<shared_ptr<dog>> dogs;
  46. dogs.push_back(make_shared<dog>("ポチ"));
  47. dogs.push_back(make_shared<dog>("コロ"));
  48. dogs.push_back(make_shared<dog>("Lassie"));
  49. for_each(dogs.begin(), dogs.end(), [](shared_ptr<dog> pet) {pet->make_sound(); });
  50.  
  51. pets.push_back(cats[0]);
  52. pets.push_back(dogs[0]);
  53. pets.push_back(cats[1]);
  54. pets.push_back(dogs[1]);
  55.  
  56. }
  57.  
  58. for_each(pets.begin(), pets.end(), [](shared_ptr<pet> pet) { pet->make_sound(); });
  59. cout << "That's it." << endl;
  60. }
  61.  
Success #stdin #stdout 0s 4404KB
stdin
Standard input is empty
stdout
タマ: にゃんにゃんおー
ミケ: にゃんにゃんおー
Kitty: にゃんにゃんおー
ポチ: わんわんおー
コロ: わんわんおー
Lassie: わんわんおー
Lassie dctor.
タマ: にゃんにゃんおー
ポチ: わんわんおー
ミケ: にゃんにゃんおー
コロ: わんわんおー
That's it.
Kitty dctor.
タマ dctor.
ポチ dctor.
ミケ dctor.
コロ dctor.