【図解】オーバーライドとオーバーロードの違いは?
こんにちは。大学のテストでオーバーライドとオーバーロードが違うものだと知った今井(@ima_maru)です。
今回は、オーバーライドとオーバーロードが別物ということをわかっていただくために、オーバーライドとオーバーロードの違いについて簡潔に解説します。
この記事のポイント!
オーバーライド ≠ オーバーロード
まったくの別物だよ
もくじ
オーバーライドとオーバーロードの違い
この2つは2文字違いという、とても似たような名前がついているややこしいものですが、機能は違います。
オーバーライド(override)とは
オーバーライドとは日本語に訳せば「オーバー(上に)ライド(乗る)」=「上書きする」という意味になります。
何かの上に乗るイメージです。
こちらは、継承と深く関わりのある機能です。
#include <iostream>
using namespace std;
class SuperClass {
public:
void print() { cout << "親クラスだよ!" << endl; }
void hoge() {}
void foo() {}
};
class SubClass : public SuperClass {
public:
/*オーバーライド*/
void print() { cout << "子クラスだよ!" << endl; }
};
int main() {
//親クラス
SuperClass superClass;
superClass.print();
//子クラス
SubClass subClass;
subClass.print();
}
//実行結果
親クラスだよ!
子クラスだよ!
このように、継承先のクラスで継承したくない、もしくは内容を変えたい関数を再定義できるのがオーバーライドです。
オーバーライドのイメージは、「親子関係に成り立つ」です。
オーバーロード(overload)とは
オーバーロードとは日本語に訳せば「オーバー(上に)ロード(読みこむ)」という意味になります。
メンバメソッドを同じ名前で複数定義できる機能です。
こちらは上書きとは違い、同じもの(構造が違うが名前が同じもの)が同じ土台に複数存在しているイメージです。
#include <iostream>
using namespace std;
class Hoge {
public:
void print() { cout << "何も渡されなかったよ" << endl; }
void print(int n) { cout << "int型が渡されたよ" << endl; }
void print(double n) { cout << "double型が渡されたよ" << endl; }
};
int main() {
Hoge hoge;
hoge.print(); //引数なし
hoge.print(3); //int型
hoge.print(3.5); //double型
}
//実行結果
何も渡されなかったよ
int型が渡されたよ
double型が渡されたよ
このように、同じクラス内で同名の関数を複数定義できるのがオーバーロードです。
オーバーライドと違いオーバーロードのイメージは「同じ土台(クラス)に成り立つ」です。