新・明解C++で学ぶオブジェクト指向プログラミング | ||||
|
第7章 抽象クラス
*バラバラに定義されたクラスに、同一のメンバー関数があっても、それらは無関係。
多相性を有効活用するために。
*点クラスと、長方形クラスをまとめる、クラス Shape は具体的な図形はもたず、抽象的な概念。
class Shape {
virtual void draw() = 0;
};
純粋指定子=0 で定義することで、純粋可能関数となる。つまり、ここでは関数本体を定義しないので、ここから派生したクラスで定義すべきことを示す。下位クラスでのオーバーライドを強要する。
*純粋仮想関数をひとつでも持つクラスは、抽象クラスである。
*抽象クラス型のオブジェクトは生成できない。ポインタはOK。
Shape* a[2];
a[0] = new Point;
a[1] = new Rectangle(7,3);
*配列a の要素型は Shape* なので、a[0]やa[1]は、Shape から派生したクラスのオブジェクトを指せる。
*抽象クラスは、実体が作れない不完全なクラスではあるものの、自身を含め、派生したクラスに対して、血縁関係をもたせる役割を果たす。
*下記のようなケースを、オーバーライドする関数の返却値型が同一でなくても、共変的であればOK。
class Shape {
public:
virtual Shape* clone() const =0;
}
class Point: public Shape {
public:
Point* clone() const {
return new Point;
}
}