J'ai trouvé l'usage géométriquement pur qu'on peut faire d'un getRect : l'inscription. En fait, un setRect n'a pas de sens, de même qu'un attribut Rect donné à tous les Transformable, tu as raison.
Mais par contre, savoir si un Transformable est inscrit dans un rectangle, dans un cercle, etc., me paraît plutôt géométrique.
Pour éviter de créer une fonction virtuelle pure qui empêcherait une instanciation d'un sf::Transformable, on peut créer une méthode statique surchargée dans sf::Transformable ou sf::Transform, qui donnerait la figure géométrique dans lequel un Transformable est inscrit.
Un pseudo-code illustrant le tout :
sf.Transform.getRectInscription drawable = case type drawable
sf.Sprite -> Rect(drawable.getPosition(), drawable.getSize())
sf.CircleShape -> Rect(drawable.radius * 2, drawable.radius * 2)
sf.Shape -> #un calcul plus compliqué
#etc.