Source: https://www.cs.cmu.edu/~mrmiller/15-121/Slides/18-OOP.pdf