純粋仮想関数
ある仕事で、関数名は決まっているけれども、
関数内で何をするかはまだ決まっていないと言ったような場合があります。
そんな時は、まず1つのクラスを作り、
その中に関数名だけ定義しておこう。
そして、関数の中身を実装する時は、
その関数名だけ定義したクラスを派生させて、
派生クラス内で、関数の中身を実装しよう。
と言う使い方が可能です。
関数名の定義だけで実装されていない関数を純粋仮想関数と言います。
純粋仮想関数は、
キーワードvirtualと関数定義の後ろに = 0 を付けるだけです。
これは、関数に0を代入するイメージから、関数は空っぽですよ。
と言う事が読み取れます。
そして、派生クラス内で
純粋仮想関数の中身を実装する事をオーバーライドと言います。
オーバーライドは、上書き、乗り換えなどの意味があります。
#include <iostream>
using namespace std;
class A {
public:
virtual void show() = 0; // 純粋仮想関数
};
class B : public A {
public:
void show() {
cout << "クラスB-show" << '\n'; // 関数内容の実装
// オーバーライド
}
};
void main(void) {
B objB;
B.show();
A objA; // エラー
}
このプログラムでは、
基本クラスAで純粋仮想関数showが定義されています。
そして、その派生クラスBで
純粋仮想関数showがオーバーライドされて、実装されています。
抽象クラス
この時、純粋仮想関数を含むクラスは、
まだあやふやな部分があると判断して、
抽象クラスと呼ばれます。
その関係で抽象クラスは、インスタンスを作る事ができません。
抽象クラスのポインタは宣言できますが。
それと、純粋仮想関数を含むクラスを派生して、
派生したクラス内でも基本クラスの純粋仮想関数を
オーバーライドしないと、そのクラスも抽象クラスとなります。