Classes for sentence-like readability
Firstly, a negative remark. The power of C++ means that it is not uncommon for new C++ developers to try and make C++ look like a language they feel more familiar with - sometimes English, sometimes a programming language they already know. This is almost always a bad thing - you need to speak like a native.

However, whilst C++ used for mainstream development does have generally understood idioms, one of its capabilities and original design aims is to try to support different styles of programming.

As well as trying to create an application syntax which is more English like, you are externalizing functionality into proxy objects rather than using the OOP paradigm of member functions. IMHO, this is perfectly legitimate as an experiment.

What you'll likely find is that as you pursue this you gave to make various compromises that finally result in you deciding that maybe this is not he way to go. Or maybe not. See what you find.

If I were to go down this path, I'd probably play with using templates to try and get some generic behaviour, given that the OOP approach us not being used. How exactly this goes will depend on whatever other functionality is needed.

For example:

template&lt;class T&gt;
class Move
{
public:
    Move(T&amp; thing)
        : thing_(thing)
    {}
    virtual void to(const Point&amp; position) = 0;
    T&amp; thing() { return thing_; }
private:
    T&amp; thing_;
};

class MoveSquare : public Move&lt;Square&gt;
{
public:
    MoveSquare(Square &amp;squareToMove)
        : Move&lt;Square&gt;(squareToMove)
    {}

    virtual void to(const Point &amp;target)
    {
        thing().topLeft = offsetHalfWidth(target);
    }

private:
    Point offsetHalfWidth(const Point&amp; p) 
    {
        const float halfWidth(thing().width / 2.0f);
        return Point{ p.x - halfWidth, p.y - halfWidth };
    }
};

class MoveCircle : public  Move&lt;Circle&gt;
{
public:
    MoveCircle(Circle &amp;circle)
        : Move&lt;Circle&gt;(circle)
    {}

    virtual void to(const Point&amp; position)
    {
        thing().middle = position;
    }

};