fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <memory>
  5.  
  6. class C;
  7. class D;
  8. class Visitor
  9. {
  10. public:
  11. virtual ~Visitor() {}
  12. virtual void visitC( C& c ) = 0;
  13. virtual void visitD( D& d ) = 0;
  14. };
  15.  
  16.  
  17. class B{
  18. private: int a; int b;
  19. public: B(const int _a, const int _b) : a(_a), b(_b){}
  20. virtual void tell(){ std::cout << "BASE" << std::endl; }
  21. virtual void Accept( Visitor& v ) = 0;
  22. };
  23.  
  24. class C : public B{
  25. std::string s;
  26. public: C(int _a, int _b, std::string _s) : B(_a, _b), s(_s){}
  27. void tell() override { std::cout << "CHILD C" << std::endl; }
  28. void CFunc() {std::cout << "Can be called only from C" << std::endl;}
  29. virtual void Accept( Visitor& v ) { v.visitC( *this ); }
  30. };
  31.  
  32. class D : public B{
  33. double d;
  34. public: D(int _a, int _b, double _d) : B(_a, _b), d(_d){}
  35. void tell() override { std::cout << "CHILD D" << std::endl; }
  36. void DFunc() {std::cout << "Can be called only from D" << std::endl;}
  37. virtual void Accept( Visitor& v ) { v.visitD( *this ); }
  38. };
  39.  
  40. int main() {
  41. std::vector<std::unique_ptr<B>> v;
  42.  
  43. v.push_back(std::make_unique<C>(1,2, "boom"));
  44. v.push_back(std::make_unique<D>(1,2, 44.3));
  45.  
  46. class callFuncVisitor : public Visitor
  47. {
  48. public:
  49. callFuncVisitor() {}
  50.  
  51. virtual void visitC( C& c )
  52. {
  53. c.CFunc();
  54. }
  55. virtual void visitD( D& d )
  56. {
  57. d.DFunc();
  58. }
  59. };
  60.  
  61. callFuncVisitor visitor;
  62. for(auto &el: v){
  63. el->Accept(visitor);
  64. }
  65. return 0;
  66. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Can be called only from C
Can be called only from D