Source: https://eecs.wsu.edu/~nroy/courses/cpts122/notes/Lecture11_Polymorphism.pdf