Source: https://www.cs.cornell.edu/courses/cs1110/2016sp/lectures/05-03-16/25.InheritanceOOP.pdf