Your problem is that when void InteractWith(Object& obj) is called, the typeid of *this and obj are the same: Object.
This is because InteractWith(Object& obj) is a simple function on the class Object. So the type id is evaluated at compile time: Object.
What you want instead is that the type id to be evaluated dynamically at run time based on inheritance. But your function is bound to Object. To allow the detection of dynamic types, make it a virtual function: virtual void InteractWith(Object& obj).
On a side note here: many consider using typeid for bad programming practice as usually what you're using typeid for should be achieved via inheritance and virtual functions. Please, read more on the matter here.