Source: https://www.irif.fr/~sangnier/enseignement/Niveau/POO-tp2.pdf