https://www.machinet.net/tutorial-eng/static-vs-dynamic-polymorphism-in-cpp-explained