How exactly does $cast work
A $cast works like any other assignment: it transfers a value from a source expression to a destination variable. In the case of $cast, that value is a handle to a class object, and it is being conditionally assigned to a class variable. There is no class object construction. The condition is the class object has to be type compatible with the class type of the destination class variable. The type of the class variable determines what properties may be accessed, not the type of object handle. The casting and assignment rules make sure it is not possible to access a class property that does not exist for the handle stored in any class variable. 

See my course on SystemVerilog classes, especially the second session.