ポリモーフィズム

ポインタによるポリモーフィズム

基本クラスへのポインタは,派生クラスも指すことができる。(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);
最終更新:2010年01月07日 12:15
ツールボックス

下から選んでください:

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