#include <iostream>
#include <vector>
using namespace std;
class Base;
class Derived;
struct Visitor {
void visit(Base *b) {cout << "BASE" << endl;}
void visit(Derived *d) {cout << "DERIVED" << endl; }
};
class Base {
private:
vector<Base*> nodes;
public:
Base(){};
Base(initializer_list<Base*> i) : nodes(i){}
protected:
virtual void accept(Visitor *v) {
v->visit(this);
}
public:
void iterate(Visitor *v) {
this->accept(v);
for (auto n : nodes) {
n->iterate(v);
}
}
};
class Derived : public Base {
public:
Derived(initializer_list<Base*>i):Base(i){}
Derived(){}
protected:
virtual void accept(Visitor *v) override {
v->visit(this);
}
};
int main() {
Base bb{new Base, new Base{new Derived{new Derived,new Base}}, new Derived{new Derived,new Base}};
bb.iterate(new Visitor);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFzZTsKY2xhc3MgRGVyaXZlZDsKc3RydWN0IFZpc2l0b3IgewoJdm9pZCB2aXNpdChCYXNlICpiKSB7Y291dCA8PCAiQkFTRSIgPDwgZW5kbDt9Cgl2b2lkIHZpc2l0KERlcml2ZWQgKmQpIHtjb3V0IDw8ICJERVJJVkVEIiA8PCBlbmRsOyB9Cn07CmNsYXNzIEJhc2Ugewpwcml2YXRlOgoJdmVjdG9yPEJhc2UqPiBub2RlczsKcHVibGljOgoJQmFzZSgpe307CglCYXNlKGluaXRpYWxpemVyX2xpc3Q8QmFzZSo+IGkpIDogbm9kZXMoaSl7fQpwcm90ZWN0ZWQ6Cgl2aXJ0dWFsIHZvaWQgYWNjZXB0KFZpc2l0b3IgKnYpIHsKCQl2LT52aXNpdCh0aGlzKTsKCX0KcHVibGljOgoJdm9pZCBpdGVyYXRlKFZpc2l0b3IgKnYpIHsKCQl0aGlzLT5hY2NlcHQodik7CgkJZm9yIChhdXRvIG4gOiBub2RlcykgewoJCQluLT5pdGVyYXRlKHYpOwoJCX0KCX0KfTsKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKcHVibGljOgoJRGVyaXZlZChpbml0aWFsaXplcl9saXN0PEJhc2UqPmkpOkJhc2UoaSl7fQoJRGVyaXZlZCgpe30KcHJvdGVjdGVkOgoJdmlydHVhbCB2b2lkIGFjY2VwdChWaXNpdG9yICp2KSBvdmVycmlkZSB7CgkJdi0+dmlzaXQodGhpcyk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCUJhc2UgYmJ7bmV3IEJhc2UsIG5ldyBCYXNle25ldyBEZXJpdmVke25ldyBEZXJpdmVkLG5ldyBCYXNlfX0sIG5ldyBEZXJpdmVke25ldyBEZXJpdmVkLG5ldyBCYXNlfX07CgliYi5pdGVyYXRlKG5ldyBWaXNpdG9yKTsKCXJldHVybiAwOwp9