Working with typecasting and polymorphism
We can use the same method to cause different things to happen according to the class on which we invoke the method. In object-oriented programming, this feature is known as polymorphism.
For example, consider that we defined a talk
method in the Animal
class. The different subclasses of Animal
must override this method to provide their own implementation of talk
.
The Dog
class overrode this method to print the representation of a dog barking, that is, a Woof
message. On the other hand, a Cat
class will override this method to print the representation of a cat meowing, that is, a Meow
 message.
Now, let's think about a CartoonDog
class that represents a dog that can really talk as part of a cartoon. The CartoonDog
class would override the talk
method to print a Hello
message because the dog can really talk.
Thus, depending on the type of instance, we will see a different result after invoking the same method with the same arguments even when all of them...