You do Up-Casting all the time without noticing. Up-casting implicitly happens when you pass a parameter to a function that doesn’t need the specific Type. Eg. the Possess function on the Controller class needs a Pawn type to Possess. If you instead give it a Character Type it still works but the Character gets Up-Casted to a Pawn since that is all the Function needs.
They reside at root level (Actor level) since the function is part of Actor.
Not sure I understand this question. Any pointer has a Type starting with Object and while casting in Blueprint, checks are made at run-time if the pointer IsA MyWidget etc. If it is then it is Valid.
Blueprints actually have a kind of multiple inheritance. Interfaces are implemented as a 2nd inheritance. Multiple inheritance is risky business and therefore Blueprint only allow inheritance that can’t clash like one Actor and Interfaces.