Abstract base class

You can return different 'data' this way, but not different 'data types'. I assume you meant different data

You can, by overloading the inherited members. To overload a member, the parameter list must be different in some way that can disambiguate it from the other overloads, there are no restrictions on the return types. Pure virtual functions are a different kettle of fish however.