抽象クラス


純粋仮想関数

仮想関数の柔軟性とその機能は前回説明した通りですが
仮想関数はその機能から、基本クラスで確定させたくない場合があります

再定義して使用することを前提として仮想関数では
基本クラスで定義しても、使わない場合があるはずです
そのような場合は純粋仮想関数として宣言します

virtual type function(arg-list) = 0;

type function(arg-list) は、通常の関数の宣言です
いつもと違うのは、これに0を代入するという奇怪な行為です
仮想関数に上の構文を用いると、定義がないことを表しています

この仮想関数は、このクラスの派生クラスで再定義されることを意味し
このクラスでは、この仮想関数を一切定義しません
つまり、この関数は再定義されなければ使えないということです
#include <iostream>
using namespace std;

class Base {
public:
	virtual void paint() = 0;
};

class Kitty : public Base {
public:
	void paint() { cout << "Kitty on your lap\n"; }
} obj1;

class Love : public Base {
public:
	void paint() { cout << "LOVE HINA\n"; }
} obj2 ;

int main() {
	Base *po1 = &obj1 , *po2 = &obj2;

	po1->paint();
	po2->paint();

	return 0;
}
このプログラムの Base クラスの paint() メンバ関数は純粋仮想関数です
Base クラスの paint() 自体は定義を持たず
これを継承したクラスは必ず再定義しなければいけません

純粋仮想関数を持つクラスを継承した派生クラスは
必ず純粋仮想関数を再定義してオーバーライドする必要があります
もし再定義していない場合は、コンパイルすることができません

Base クラスのような、純粋仮想関数を持つクラスを抽象クラスと呼びます
抽象クラスは未完成なクラスでオブジェクトを作れません
純粋仮想関数を含む抽象クラスは、継承されてはじめて使うことができるのです
以下のプログラムは、コンパイルすることができません
#include <iostream>
using namespace std;

class Base {
public:
	virtual void paint() = 0;
} obj ;	//抽象クラスのオブジェクトは作れない

class Kitty : public Base {
	//純粋仮想関数 paint() をオーバーライドしていない
} obj1;

int main() {
	return 0;
}
Kitty クラスは Base クラスを継承していますが
純粋仮想関数 paint() を再定義(オーバーライド)していないので
このクラスも抽象クラスと見なされるため、エラーになります



前のページへ戻る次のページへ