#include <iostream>
class Visitor;

class Element{ 
public : 
  virtual void Accept(Visitor&) = 0;
protected : 
  Element() {};   
  int num;
};

class Visitor {
public: 
  void Visit(Element* pe) { std::cout << getNum(pe) << '\n'; }
  int getNum(Element* pe)
  { 
    struct ElementNumAccessor : private Element
    {
      ElementNumAccessor(Element const& e) : Element(e) {}   
      int getNum() { return num; }

      void Accept(Visitor&);
    };
      
    ElementNumAccessor ea(*pe);
    return ea.getNum();
  }
};


         class ElementA : public Element{
                 public : ElementA() { num = 5; }; 
                 void Accept(Visitor& v) {v.Visit(this);}
         };

         class ElementB : public Element{
                 public : ElementB() { num = 6; }; 
                 void Accept(Visitor& v) {v.Visit(this);}
         };

         
int main()
{
    ElementA ea;
    ElementB eb;
    Visitor v;
    ea.Accept(v);
    eb.Accept(v);
    
}