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