#include <iostream>
class Visitor;
class Base
{
public:
virtual ~Base() {}
virtual void visit(Visitor&) = 0;
};
class Derived : public Base
{
protected:
int someVar = 2;
public:
int getSomeVar () {return this->someVar;}
void visit(Visitor& v) override;
};
class Visitor {
public:
void visit(Derived& d) {
std::cout << d.getSomeVar() << std::endl;
}
};
void Derived::visit(Visitor& v) {
v.visit(*this);
}
int main()
{
Visitor v;
// DO NOT USE MANUAL HEAP ALLOCATION IN REAL CODE !!!!!!!!
Base * b = new Derived;
b->visit(v);
delete b;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgVmlzaXRvcjsKCmNsYXNzIEJhc2UKewogICAgcHVibGljOgogICAgICAgIHZpcnR1YWwgfkJhc2UoKSB7fQogICAgICAgIHZpcnR1YWwgdm9pZCB2aXNpdChWaXNpdG9yJikgPSAwOwp9OwoKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCnsKICAgIHByb3RlY3RlZDoKICAgICAgICBpbnQgc29tZVZhciA9IDI7CgogICAgcHVibGljOgogICAgICAgIGludCBnZXRTb21lVmFyICgpIHtyZXR1cm4gdGhpcy0+c29tZVZhcjt9CiAgICAgICAgdm9pZCB2aXNpdChWaXNpdG9yJiB2KSBvdmVycmlkZTsKfTsKY2xhc3MgVmlzaXRvciB7CiAgICBwdWJsaWM6CiAgICAgICAgIHZvaWQgdmlzaXQoRGVyaXZlZCYgZCkgewogICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBkLmdldFNvbWVWYXIoKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0KfTsKCnZvaWQgRGVyaXZlZDo6dmlzaXQoVmlzaXRvciYgdikgewogICAgdi52aXNpdCgqdGhpcyk7Cn0KCmludCBtYWluKCkKewogICAgVmlzaXRvciB2OwogICAgLy8gRE8gTk9UIFVTRSBNQU5VQUwgSEVBUCBBTExPQ0FUSU9OIElOIFJFQUwgQ09ERSAhISEhISEhIQogICAgQmFzZSAqIGIgPSBuZXcgRGVyaXZlZDsKICAgIGItPnZpc2l0KHYpOwogICAgZGVsZXRlIGI7CiAgICByZXR1cm4gMDsKfQo=