非仮想メソッドをポリモーフィックに使う方法

以下の、Base::func() をポリモーフィックに使いたい。

class Base
{
public:
  void func(){ ... }
};

class Derived : public Base
{
  ...
};

案その1

仮想メソッドに変更してしまう。

class Base
{
public:
  virtual void func(){ ... }
};

class Derived : public Base
{
public:
  virtual void func(){ ... }
};

まあ、それが出来れば苦労しない。

余談

現実の状況としては、Baseは、MFCのCDialogから派生されたクラス。func()は、そのメッセージハンドラ。VisualC++を使って、クラスもハンドラもウィザードで生成した。
生成されたハンドラは非仮想。MFCフレームワークの仕組みであるマクロを駆使したメッセージマップに、その関数ポインタが登録されている。
だから、仮想メソッドに変えても、期待通りに動くのか分からなかった。もちろん、よくよくソースを読んでいけば分かるだろう。実際、静的な構造体の配列で、なにやらしているところまでは分かった。でも、面倒になってきたので、次善の策を考えた。
MFCフレームワークに組み込まれるクラスは派生するな、ということかもしれない。しかし、その通りにすると、コードが汚くなる。フラグとif文が散乱して、見るも無惨な状態になる。汚いコードは管理が手間だし、手間のかかるコードはバグが入りやすい。そのために小細工したこともある。そのうち書こう。

案その2

別の仮想メソッドを新規に作り、処理の内容をすべてそちらにコピーする。
元の非仮想メソッドは、新規の仮想メソッドを呼び出すようにする。
Templateパターンの応用。というか、呼び出すメソッドがひとつであるというだけで、そのまま。

class Base
{
  virtual void anotherFunc(){ ... }
public:
  void func() { anotherFunc(); }
};

class Derived : public Base
{
  virtual void anotherFunc(){ ... }
};

とりあえず、これで決着。