ポリモーフィズム

「ポリモーフィズム」の編集履歴(バックアップ)一覧に戻る

ポリモーフィズム - (2010/01/07 (木) 12:15:46) のソース

== ポインタによるポリモーフィズム ==
 '''基本クラスへのポインタは,派生クラスも指すことができる。(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);
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。