NVIパターンで困った

先日uskzさんに教えてもらったNVIパターンが面白い。
後付けで「前処理、後処理」の追加ができるのが、行き当たりばったりプログラムを行なう私にぴったりだ。
だが今日困ったことがあった。

class IWindow
{
private:
    virtual void drawMain(int nX, int nY)const = 0;
public:
    void draw(int nX, int nY)const
    {
        RECT rc = setClip(nX, nY, getWidth(), getHeight());
        drawMain(nX, nY);
        setClip(&fc);
    }
};

class CWindow : public IWindow
{
private:
    virtual void drawMain(int nX, int nY)const; // ウインドウを実際に書く処理を記述した.
};

としていたのだが…。

class CWindowWithScrollArrow : public CWindow

としたとき困ってしまった。
CWindowWithScrollArrowは極単純に、CWindowと同じ描画を行なった上に矢印を表示するだけのものだ。
そこで

void CWindowWithScrollWrrow::drawMain(int nX, int nY)const
{
    CWindow::draw(nX, nY);
    drawScrollArrowUp(nX + getWidth() / 2, nY);
    drawScrollArrowDown(nX + getWidth() / 2, nY + getHeight());
}

とした。
ひゃあ!無限ループだ!
とはいうものの、CWindow::drawMainはprivateなので呼び出せない。
どうしたらいいんだ。
とりあえずdrawMainをprotectedにすることで急場をしのいだ。しかしこれじゃ意味無いのではないか?
 
継承されることが前提のものは、自身の描画を別のprotectedなメソッドとして提供するべきか?
でも、誰がどう継承したいかなんて予測不能だ。
そもそもdrawMainをprivateにした意味も薄れる。

わかりづらかったようなので、記述を追加しました