fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <vector>
  4.  
  5. class A;
  6. class B;
  7. class C;
  8. class Visitor
  9. {
  10. public:
  11. void visit(A&)
  12. {
  13. std::cout << "A" << std::endl;
  14. }
  15. void visit(B&)
  16. {
  17. std::cout << "B" << std::endl;
  18. }
  19. void visit(C&)
  20. {
  21. std::cout << "C" << std::endl;
  22. }
  23. };
  24.  
  25. class Base {
  26. public:
  27. virtual void accept(Visitor& v) = 0;
  28. };
  29. class A : public Base{
  30. public:
  31. void accept(Visitor& v) override
  32. {
  33. v.visit(*this);
  34. }
  35. };
  36. class B : public Base{
  37. public:
  38. void accept(Visitor& v) override
  39. {
  40. v.visit(*this);
  41. }
  42. };
  43. class C : public Base{
  44. public:
  45. void accept(Visitor& v) override
  46. {
  47. v.visit(*this);
  48. }
  49. };
  50.  
  51. class CollectionOfBase
  52. {
  53. public:
  54. void add (std::shared_ptr<Base> item){m_items.push_back(item);}
  55. std::vector<std::shared_ptr<Base>> const& getItems() const {return m_items;}
  56.  
  57. private:
  58. std::vector<std::shared_ptr<Base>> m_items;
  59. };
  60.  
  61. int main()
  62. {
  63. using namespace std;
  64.  
  65. CollectionOfBase collection;
  66.  
  67. collection.add(make_shared<A>());
  68. collection.add(make_shared<A>());
  69. collection.add(make_shared<C>());
  70. collection.add(make_shared<B>());
  71.  
  72. Visitor v;
  73. for (auto const& x : collection.getItems())
  74. {
  75. x->accept(v);
  76. }
  77. /*
  78. The desired output of this loop should be:
  79.  
  80. A
  81. A
  82. C
  83. B
  84.  
  85. */
  86.  
  87. return 0;
  88. }
  89.  
  90.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
A
A
C
B