【図解】オーバーライドとオーバーロードの違いは?

こんにちは。大学のテストでオーバーライドとオーバーロードが違うものだと知った今井(@ima_maru)です。

今回は、オーバーライドとオーバーロードが別物ということをわかっていただくために、オーバーライドとオーバーロードの違いについて簡潔に解説します。

[box03 title=”この記事のポイント!“]

オーバーライド ≠ オーバーロード

まったくの別物だよ

[/box03]

オーバーライドとオーバーロードの違い

この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();
}
//実行結果
親クラスだよ!
子クラスだよ!

このように、継承先のクラスで継承したくない、もしくは内容を変えたい関数を再定義できるのがオーバーライドです。

オーバーライドのイメージは、「親子関係に成り立つ」です。

オーバーライドの詳しい解説はこちらの記事で書いています。

https://www.jpazamu.com/override/

オーバーロード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型が渡されたよ

このように、同じクラス内で同名の関数を複数定義できるのがオーバーロードです。

オーバーライドと違いオーバーロードのイメージは「同じ土台(クラス)に成り立つ」です。

オーバーロードの詳しい解説はこちらで書いています。

https://www.jpazamu.com/function_overload/

[box05 title=”まとめ“]

オーバーライドは親子関係のクラスの関係に成り立つ
オーバーロードは同じクラス内で成り立つ

[/box05]

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です