Maybe this type of thinking will help:
This is one of the great advantages of OOD. If you were not able to make a generalized class and extend it, then you would have to create all these different method names that did essentially the same thing: You would have to have a "carDrive()", "truckDrive", "segwayDrive", etc.
With OO, no matter what type of Vehicle that is on the other end of that Vehicle reference, all you have to do is call the drive() method, and that subclass of Vehicle knows what to do. So, for example, if you didn't know there was a Car on the other end of that Vehicle reference, it wouldn't have mattered: The Car still knew how to drive itself.
To address some more concrete issues:
That one line that reads v = c. The way I try to remember it, is ok, "c" is coverted to a "v" so that it can fit into a "v." "c" CAN be converted to a "v" because in actuality "c" is just a "v" with some add-ons.
Here it seems like you are thinking of object references as if they were primitive data types. What happens in the "v = c" line is that the address of the object that c is pointing to is being given to v, so now they point to the same object. "c" is not being converted to a "v", "c" is actually the same as it was before the assignment; the difference is, "v" is now pointing to what "c" is pointing to: The Car.
This is like what Anupam was saying.
[ April 21, 2003: Message edited by: Larry Jones ]