>>180
shapeクラスの方を
 class shape {
  public: void render() { if( is_visible() ) render_self(); }
  private: virtual void render_self() = 0;
 };
とするとか、
 >> Exceptional C++ 23
 >> 仮想関数をpublicにすることは避けてtemplate methodパターンの利用を考えよう

ループの方でNULLチェックの代わりにis_visibleチェックをするとか
その使い方に対して効率の良い operator new/delete を書くとか幾らでも手はあると思うぞ。