The full answer to this would be an entire crash course in Object Orientated Coding. However, I believe there are limitations to the length these answers can be, so lets see if we can’t simplify a bit.
When you cast to a base (or parent) class, all references to the object through that name are treated exactly as if it were genuinely that parent class, so by default the additional fields/methods in the derived class are not available. Casting to parent classes is best done only when you no longer need the additional functionality of the child class.
However, there are of course always special situations where “best done” no longer applies.
These are generally related to storage, arrays of related but not identical object types, comparison of apples and pears (not quite apples, but they’re both fruit, so that’s fine, right?) and so on.
When you hit this point, it’s always best to pause a moment and meditate on the eternal koan : “do I really want to do this?”.
Can you cast it back to a child class and get the values that way? Sometimes yes, but this is a nasty hack as you then have to keep track of whether or not each item is actually of the correct child class (And if you’re doing that, well, why aren’t you storing them as the child class in the first place?)
This is where virtual classes come into play.
Again, a bit longer than we want to get into here, and covered a million times over, a lot better than I can here on a million c# howto pages. Just Google “c# virtual howto”.
Good luck on the quest for O.O. stylings and structures.