2006-06-29
前回は仮想関数のお話でしたが、今回は仮想関数の一種である「純粋仮想関数」についてです。前回取り上げたshapeクラスを例にとって、純粋仮想関数について簡単に書いてみることにします。
shapeクラスは、図形を表現するための基底クラスですので、その具体的な形状が決まっていません。具体的な形状は派生クラスで、cireleクラスであれば円、rectangleクラスであれば長方形を表すことになります。具体的な形状が決まらないと、図形を描画することができませんから、shapeクラスのdrawメンバ関数は何も処理することができません。
このような場合、drawメンバ関数を純粋仮想関数とすることで、派生クラスでdrawメンバ関数を上書きすることを利用者に強制することができます。C++では、このように、特定のセマンティスクを強制するための表現方法がいろいろと備わっています。つまり、Cの場合は、プログラマの責任で注意深く扱わなければならなかったものも、コンパイラに検出させることができるようになっているわけです。
それでは、純粋仮想関数の記述の仕方です。
class shape
{
public:
virtual void draw() = 0;
};
このように、仮想関数が純粋仮想関数であることを指定するには、「= 0」を記述します。ちょうど、関数へのポインタを空ポインタで初期化するのと同じイメージです。
純粋仮想関数を一つでも含むクラスは「抽象クラス」と呼ばれ、それ自体の型を持つオブジェクトを生成することができません。抽象クラスは、必ず派生クラスを定義して、その派生クラス型のオブジェクトを生成する必要があります。もちろん、派生クラスでも、すべての純粋仮想関数を上書きしなかった場合には、その派生クラスも抽象クラスとなり、その型のオブジェクトを生成できません。
Comment