抽象クラス

提供: RAD Studio
移動先: 案内検索

多態クラス:インデックス への移動

抽象クラス(abstract class)は,最低 1 つの純粋仮想関数(pure virtual function)を持つクラスです。仮想関数は,ゼロにセットすることにより,「純粋」として定義されます。

抽象クラスは,ほかのクラスの基本クラスとしてのみ使うことができます。抽象クラスのオブジェクトは作成できません。抽象クラスは,関数の引数型または戻り型としては使用できません。ただし,抽象クラスを指すポインタを宣言することはできます。初期化において一時的なオブジェクトが必要とされない場合には,抽象クラスへの参照も許されています。次に例を示します。



 class shape {       // 抽象クラス
    point center;
 .
 .
 .
 public:
    where() { return center; }
    move(point p) { center = p; draw(); }
    virtual void rotate(int) = 0; // 純粋仮想関数
    virtual void draw() = 0;      // 純粋仮想関数
    virtual void hilite() = 0;    // 純粋仮想関数
 .
 .
 .
 }
 shape x;// エラー: 抽象クラスのオブジェクトを作成しようとしている
    shape* sptr;// 抽象クラスへのポインタは OK
    shape f();// エラー: 抽象クラスは戻り型にできない
 int g(shape s);// ERROR: エラー: 抽象クラスは関数の引数型にはできない
 shape& h(shape&);// 抽象クラスへの参照は,戻り値および
  // 関数の引数として使える



抽象クラス B を直接の基本クラスとする派生クラス D があるとします。このとき,B 内の各純粋仮想関数 pvf に対して,D が pvf の定義をしなければ,pvf は D の純粋メンバー関数となり,D も抽象クラスとなります。

次に,概要を前述したクラス shape を使って例を示します。



 class circle : public shape {// circle は抽象クラスから派生したクラス
    int radius;// private
 public:
    void rotate(int) { }// 仮想関数の定義
             // 円を回転させる動作はない
    void draw();      // circle::draw がどこかで定義しなければならない
 }



メンバー関数は抽象クラスのコンストラクタから呼び出せますが,コンストラクタなどから直接または間接に純粋仮想関数を呼び出すと,実行時エラーを引き起こします。

関連項目