#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;
}
