fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. class Base;
  6. class Derived;
  7. struct Visitor {
  8. void visit(Base *b) {cout << "BASE" << endl;}
  9. void visit(Derived *d) {cout << "DERIVED" << endl; }
  10. };
  11. class Base {
  12. private:
  13. vector<Base*> nodes;
  14. public:
  15. Base(){};
  16. Base(initializer_list<Base*> i) : nodes(i){}
  17. protected:
  18. virtual void accept(Visitor *v) {
  19. v->visit(this);
  20. }
  21. public:
  22. void iterate(Visitor *v) {
  23. this->accept(v);
  24. for (auto n : nodes) {
  25. n->iterate(v);
  26. }
  27. }
  28. };
  29. class Derived : public Base {
  30. public:
  31. Derived(initializer_list<Base*>i):Base(i){}
  32. Derived(){}
  33. protected:
  34. virtual void accept(Visitor *v) override {
  35. v->visit(this);
  36. }
  37. };
  38.  
  39. int main() {
  40. Base bb{new Base, new Base{new Derived{new Derived,new Base}}, new Derived{new Derived,new Base}};
  41. bb.iterate(new Visitor);
  42. return 0;
  43. }
Success #stdin #stdout 0s 4316KB
stdin
Standard input is empty
stdout
BASE
BASE
BASE
DERIVED
DERIVED
BASE
DERIVED
DERIVED
BASE