基本クラスとその派生クラスに同じ名前の関数がある場合は、
引数のデータ型や引数の個数が1つでも違っていれば
呼び分ける事ができますが、
引数のデータ型、引数の個数が全く同じだったら
呼び分ける事ができるでしょうか?
例えば、基本クラスにshow関数があったとします。
そして、その派生クラスにもshow関数があったとします。
さらに、それぞれのshow関数は、
引数のデータ型、個数が全く同じだとします。
全く同じなので、オーバーロード機能では解決できません。
こういう場合、派生クラスでshow関数が再定義された事によって、
基本クラスのshow関数が派生クラスのshow関数によって上書きされ、
見えなくなります。
これをオーバーライドと言います。
オーバーライドすれば、
関数の内容を全く新しいコードに書き換える事が可能です。
オーバーライド実装例
#include <iostream>
using namespace std;
/********** 基本クラス **********/
class kihon {
public:
void show() {
cout << "基本クラス:show()" << '\n';
}
};
/********** 派生クラス **********/
class hasei : public kihon {
public:
void show() {
cout << "派生クラス:show()" << '\n';
}
};
void main() {
kihon a;
hasei b;
a.show(); // 通常通り基本クラスのshow関数が呼ばれる
b.show(); // オーバーライドしたshow関数が呼ばれる
}
このプログラムには、基本クラスとその派生クラスにshow関数があります。
しかし、オーバーライドにより、適切に呼び分けられています。
オーバーライドする関数は、
引数のデータ型、引数の個数を同じにしなければなりませんが、
戻り値に関しては、一致させる必要はありません。
オーバーライドした関数内の処理は、
オーバーライドされた基本クラスの関数内容の処理を含む場合があるので、
オーバーライドした関数内で
オーバーライドされた基本クラスの関数を呼ぶ事ができるようになっています。
実装例
#include <iostream>
using namespace std;
/********** 基本クラス **********/
class kihon {
public:
void show() {
cout << "基本クラス:show()" << '\n';
}
};
/********** 派生クラス **********/
class hasei : public kihon {
public:
void show() {
kihon::show();
cout << "派生クラス:show()" << '\n';
}
};
void main() {
hasei b;
b.show();
}
派生クラスのshow関数内で、基本クラスのshow関数を呼びたいので、
スコープ解決演算子::(ダブルコロン)を使って呼び出しています。
::(ダブルコロン)を付けずにshow();とすると、
派生クラス、つまり自分自身のshow関数を呼び出す。
と言う意味になってしまい、再帰処理になってしまいます。