It's possible that you don't need to redesign all that much if you're turning things around, having the Renderable render itself on the Display, just add an extra indirection:
void Display::render(Renderable* renderable){ renderable->render(this);}class Renderable{public: virtual void render(Display* display) = 0;};class Mesh : public Renderable{public: virtual void render(Display* display) { display->renderMesh(my_mesh); }private: Mesh* my_mesh;};class Composite : public Renderable{public: Composite(Renderable* r1, Renderable* r2) : r1(r1), r2(r2) { } virtual void render(Display* display) { r1->render(display); r2->render(display); }private: Renderable *r1, *r2;};
Using this code, you can have Renderables which are actually composites or use some other logic than just rendering a mesh (see LorenzoGatti's post). You could see it as defining a whole new language for defining renderable stuff: composing, transforming, ... with each operation represented by a class.