Refactoring adding const-correctness, final, override.
Refactorized using make_shared / unique, init-lists