Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained