仮想関数

親のポインタで子供を指したときの動作
> IHoge *p;
> p = new Hoge;
> p->func();    ←ここ

func が親にも子供にもあるとき、
1. 通常は親の IHoge::func が呼び出されてしまう。
2. Hoge::func を呼び出したいときは、親側に virtual を付ける。

※ funcを子供しか持っていないときはエラー
つまり、親ポインタから呼び出せるのはオーバーロードされたものに限る。
特に、デストラクタは必ず呼び出されるが、子供のデストラクタを呼び出すには
親のデストラクタがオーバーロードされている必要がある。
従って純粋仮想クラスには特に何もしなくても仮想デストラクタを宣言しておく。

抽象クラス(Interface class)を作るのに使う。

純粋仮想関数と仮想デストラクタを入れる。
> class IHoge {
> public:
>   virtual double hoge( hage ) =0;    =0で純粋仮想関数
>   virtual ~Hoge(){}                   仮想デストラクタは空定義しておく!
> };
これをpublic継承して使う。
> class Hoge : public IHoge {
> public:
>   double hoge( hage );
> };
Interface-Derivationの関係
親クラスのポインタで,子クラスのポインタを兼ねることができる(ポリモーフィズム)ので,
同じ Interface を持つものの実装を簡単に切り替えられるようになる。
> IHoge *pHoge;
>
> pHoge = new HogeTypeA;
> pHoge->hoge( hage );
> delete pHoge;
>
> pHoge = new HogeTypeB;
> pHoge->hoge( hage );
> delete pHoge;

純粋仮想関数と仮想関数の違い

仮想関数は、親側でも定義ができる。
つまり、子供側で定義されていないときのデフォルト動作を定義しておくという使い方ができる。
純粋仮想関数は、親側では定義できない。
逆にいうと、必ず子供側で実装が必要な仕様を強制する。
最終更新:2010年05月29日 18:55
ツールボックス

下から選んでください:

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