非仮想メソッドをポリモーフィックに使う方法
以下の、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文が散乱して、見るも無惨な状態になる。汚いコードは管理が手間だし、手間のかかるコードはバグが入りやすい。そのために小細工したこともある。そのうち書こう。