Imagine your object is like a box with your box being an interface, or type. So I have an Animal class with a NumberOfLegs property. Creating an instance of animal is like having a box and that box is the Animal box, and inside it is NumberOfLegs. All I can do is open that box and examine the contents.
Now let's say I have a Dog class, and dog has a LikesWalkies property, and dog inherits animal. Now I have a box within a box. The outer box is called Dog and contains LikesWalkies and it also contains an Animal box and inside that is NumberOfLegs. When I ask what inside Dog that includes everything inside the boxes that are inside Dog too. So when I say dog.LikesWalkies that is valid as Dog contains that property, when I say dog.NumberOfLegs that is also valid as while Dog doesn't contain that property, it contains a box that does contain that property.
Think about casting as shifting the focus of which box you're interested in.
Dog dog = new Dog();
Dog.LikesWalkies = true;
Dog.NumberOfLegs = 4;
Animal animal = (Animal) dog;
In the code above we can ask dog if it likes walkies and how many legs it has. However with animal we can only ask how many legs, this is because we are looking at the Animal box inside dog. Even though the animal box is inside the dog box, we can't see "outside" animal to its parent properties. Those properties still exist...we just can't see them via the animal casting as the animal casting is only looking at the inner Animal box.
Now let's say I try this
Animal animal = new Animal();
Dog dog = (Dog) animal;
it won't work. When we create an instance of Dog we automatically create an instance of the Animal box inside it so we can cast from Dog to Animal. When we create an Animal box....there is no Dog box around it which is why you can't "cast up", so the above code will throw an exception. After all, Cat could also inherit Animal as could many other classes. When you create the subclass (Animal) it creates no other outer boxes so you can't cast to those.
Now we'll get to your actual question, hopefully you're still with me :)
The Controls collection can contain any box that has a Control box inside it (ie any class that inherits Control). So your Controls collection actually has things like TextBox, Label etc, and each TextBox box and each Label box has a Control box inside it. So when you ask for a textbox via FindControl what you get back is a TextBox box, but the reference isn't pointing to the outer box (TextBox) but the inner box (Control). Although it's the inner box you're looking at, the outer box of TextBox still exists so we can actually "cast up" and shift our focus from the inner Control box to the outer TextBox box and access all of its properties.
So that's kinda what is going on. An object can have many interfaces and you can have a reference to a particular interface on that object, but as long as the object supports other interfaces you can cast to them. When you can't cast to them is when they simply don't support them. A Dog object has a Dog interface but also an Animal interface so we can cast between Dog and Animal, but an Animal object only has an Animal interface so we can't cast from Animal or anything else.
http://s27.postimg.org/bd3gnpoeb/findcontrol.png[
^]