== ポインタによるポリモーフィズム == '''基本クラスへのポインタは,派生クラスも指すことができる。(public継承関係のとき!)''' Super *p; Sub obj; p = &obj; pからは派生クラスのメンバにアクセスすることはできない。 特に,オーバーロードされたメンバ関数はもとの関数が呼び出される。 p->func(); '''これをそのまま派生クラスのポインタと見なすには,キャストが必要(危険な薫り)。''' ((*Sub) p ) -> func(); このようなややこしさを回避するためには,基本クラスのメンバ関数を仮想関数にする。 virtual func(); == 関数ポインタの折衷 == 引数の数があわないときに,関数ポインタが使いたい。 double func(double x, int option) ... !!!double (*p)(double) = func;!!! '''静的メンバ関数を使う。''' class Func { static double option; public: static double func( double x ); } p = Func::func; '''次はだめ''' p の型が obj.func とあわないというエラーが出る。 class Func { double option; public: Func( double _option ); double func( double x ); } Func obj( ... ); p = obj.func; === ストラテジーパターン === '''インタフェースクラスを適用する。''' class IFunc { public: virtual double func( double x ) =0; }; class Func : public IFunc { public: double func( double x ); }; IFunc* pFunc = new Func( ... ); pFunc->func(x);