fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class Base;
  5. class Derived1;
  6. class Derived2;
  7.  
  8. class IBaseVisitor
  9. {
  10. public:
  11. virtual ~IBaseVisitor() = default;
  12. virtual void visit(Base&) = 0;
  13. virtual void visit(Derived1&) = 0;
  14. virtual void visit(Derived2&) = 0;
  15. };
  16.  
  17. class Base
  18. {
  19. public:
  20. Base() { std::cout << "Base::Base" << std::endl; }
  21. virtual ~Base() { std::cout << "Base::~Base" << std::endl; }
  22. virtual void accept(IBaseVisitor& v) { v.visit(*this); }
  23. };
  24.  
  25. class Derived1 : public Base
  26. {
  27. public:
  28. void func1() { std::cout << "Derived1::func1()" << std::endl; }
  29. void accept(IBaseVisitor& v) override { v.visit(*this); }
  30. };
  31.  
  32. class Derived2 : public Base
  33. {
  34. public:
  35. void func2() { std::cout << "Derived2::func2()" << std::endl; }
  36. void accept(IBaseVisitor& v) override { v.visit(*this); }
  37. };
  38.  
  39.  
  40. struct SomeFuncVisitor : IBaseVisitor
  41. {
  42. void visit(Base&) override { std::cout << "None" << std::endl; }
  43. void visit(Derived1& d1) override { d1.func1(); }
  44. void visit(Derived2& d2) override { d2.func2(); }
  45. };
  46.  
  47. int main()
  48. {
  49. Derived1 derived1;
  50. Derived2 derived2;
  51. std::vector<Base *> vb {&derived1, &derived2};
  52.  
  53. SomeFuncVisitor visitor;
  54. for (Base* base : vb) {
  55. base->accept(visitor);
  56. }
  57. }
  58.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Base::Base
Base::Base
Derived1::func1()
Derived2::func2()
Base::~Base
Base::~Base