抽象クラス
多態クラス:インデックス への移動
抽象クラスは、最低 1 つ、純粋仮想(pure virtual)関数を持つクラスです。 virtual 関数は、0 に設定することにより、pure として指定されます。
抽象クラスは、他のクラスの基底クラスとしてのみ、使用することができます。 抽象クラスのオブジェクトは作成できません。 抽象クラスは、引数型として、または、関数の戻り値型として、使用することはできません。 しかし、抽象クラスへのポインタは宣言することができます。 初期化において一時的なオブジェクトが必要とされない場合には、抽象クラスへの参照も許されています。 例えば、
class shape { // abstract class
point center;
// …
public:
where() { return center; }
move(point p) { center = p; draw(); }
virtual void rotate(int) = 0; // pure virtual function
virtual void draw() = 0; // pure virtual function
virtual void hilite() = 0; // pure virtual function
// …
}
shape x; // ERROR: attempt to create an object of an abstract class
shape* sptr; // pointer to abstract class is OK
shape f(); // ERROR: abstract class cannot be a return type
int g(shape s); // ERROR: abstract class cannot be a function argument type
shape& h(shape&); // reference to abstract class as return
// value or function argument is OK
抽象クラス B を直近の基底クラスとする、派生クラス D があるとします。 このとき、B 内の純粋仮想関数 pvf それぞれに対して、D が pvf を定義していなければ、pvf は D の純粋メンバー関数となり、D もまた抽象クラスとなります。
たとえば、前述で概要を示したクラス shape を使用すると、
class circle : public shape { // circle derived from abstract class
int radius;// private
public:
void rotate(int) { } // virtual function defined: no action
// to rotate a circle
void draw(); // circle::draw must be defined somewhere
}
メンバー関数は抽象クラスのコンストラクタから呼び出せますが、そのようなコンストラクタからの直接または間接的な純粋仮想関数呼び出しは、実行時エラーを発生させます。