#pragma once #include #include class Rail { public: Rail () = default; virtual ~Rail () = default; virtual void travel (std::istream & is); virtual void visit (); void connect (Rail * rail); protected: void travel_to (std::istream & is, Rail * target); bool visited { false }; Rail * to { nullptr }; }; class Junction : public Rail { public: Junction () = default; void travel (std::istream & is) override; void visit () override; void connect (Rail * forward, Rail * other); private: char ans; Rail * right { nullptr }; }; class Destination : public Rail { public: Destination (std::string const & name); void travel (std::istream & is) override; private: std::string name { }; };