I usually use pure virtual functions for those methods that are required by my code to work well. Therefore, I create interfaces and then other users implement their derived
Suppose you have a Base pointer, pointing to a Derived object. Having the Base pointer, you have "access" only to the Base's interface (unless you cast to Derived pointer, but this is not what you need).