I'm new to C++, and was wondering what's considered the best strategy for splitting up ones code into different classes?
First, you should create classes according to the objects in your game. For example a class for the player, one for the enemies, one for projectiles, one for scenery objects... When you see that these objects have certain commonalities (e.g. player and enemy both have a position and a velocity), inheritance is an option.
Apart from that, there are often classes that are responsible of the correct game flow. For example, a class that manages the game (invokes the game object's methods), one for physics, a renderer class etc. But there are many possibilities.
One thing that many game programmers don't do, but that I find relatively important, is the separation of graphics and logics. At least up to a certain limit... Don't inherit Player from sf::Sprite. Rather make the sprite a member of the Player class. Or even better, don't use any SFML stuff in the player class, keep Player a completely logical entity, independent of its graphical representation. While this is idealistic and often not the best solution to apply in practice, the separation of different responsibilities is fundamentally no bad idea. This concerns also other classes: Don't write huge classes that handle everything, and keep dependencies small.
Read also
this thread, there (and in the links) are many design tips.
There are certain game objects which different classes will all need access to, is it a better approach to define static class variables or to pass references around?
The latter. Generally, you should try to avoid global/static data when possible.