Covariatn Return Types and Smart Pointers