Concerning GetRect(), I don't fully agree with you. The existence of a GetRect() method shouldn't depend too much on the internal implementation. For example, why should sf::String have a GetRect() method, while sf::Sprite has none? A bounding rectangle obviously makes sense at sprites, too. All this stuff could be made much easier if the implementation were more uniform.
If those classes represent their geometry by three vectors (namely position, origin and size) and support respective getter and setter functions, the interface will be more consistent. This would allow to program generically and write a single function template which can be applied to all objects meeting those requirements:
template <typename RectangularObject>
sf::FloatRect GetBoundingRect(const RectangularObject& Obj)
{
sf::Vector2f LeftUpper = Obj.GetPosition() - Obj.GetOrigin();
sf::Vector2f RightLower = LeftUpper + Obj.GetSize();
return sf::FloatRect(LeftUpper.x, LeftUpper.y, RightLower.x, RightLower.y);
}