オーバーロード


アニメ『オーバーロードⅢ』

待ってました、第3期。前記事「簡単に赤血球を動かす(Blender)」で、プレアデスの言葉の意味も知って、さらにアニメが面白くなりました。このアニメは異世界物ではあるのですが、他の異世界物を追従させない面白さがあります。

手続き型しかやったことのないプログラマーが、オブジェクト思考の世界の仕事をすると、それはもう異世界。そんなオブジェクト思考を始めたばかりの友人から、オーバーロードとオーバーライドがどっちがどっちか判らないみたいなことを聞いたことがあります。
言葉は似てて意味が異なる例えば、カラスとガラスぐらい違う、割る方と割られる方ぐらい違うと思っていたので、そういう感覚の違いを知って、ちょっと得した気分になりました。でも案外、オーバーロードとオーバーライドについてネットでも忘れてしまう話って結構見つかるので、感覚がすれてるのは自分かもしれない、という発見もしました。

身に着けるための方法としては、片方をとにかく覚えるというやり方もあります。
今回は、「オーバーロード(OVERLORD)」ということで、「オーバーロード(OVERLOAD)」について、覚え方について考えてみます。

オーバーロード(method overloading)は、多重定義のことですね。
loadは、積み荷を乗せるとか装填するとか、山積みにするとかの意味があるので、
たくさんの定義って覚えておくと忘れにくいです。
いっそのことオーバーロードじゃなくて多重定義って使えばいいと思うんですけどねえ。

では覚えるための例を挙げます。オーバーロードといっても、methodのオーバーロードではなく、関数のオーバーロード(function overloading)です。

takk@deb9:~/tmp$ cat t.cpp
#include <stdio.h>

int ToHex(unsigned char a)
{
	printf("%02x\n",a);
}

int ToHex(unsigned short a)
{
	printf("%04x\n",a);
}

int main()
{
	char data=100;

	ToHex((unsigned char)data);
	ToHex((unsigned short)data);
}
takk@deb9:~/tmp$ 

同じ関数名で引数が異なる関数を定義してますね。使用する場合は、キャストを使ってます。
実行してみます。

takk@deb9:~/tmp$ g++ t.cpp
takk@deb9:~/tmp$ ./a.out
64
0064
takk@deb9:~/tmp$ 

それぞれが実行されました。

次は、main関数から呼び出すToHexの引数をあいまいにしてみます。

int main()
{
	char data=100;

	ToHex((unsigned char)data);
	ToHex(data);
}
takk@deb9:~/tmp$ 

ビルドすると、エラーになります。

takk@deb9:~/tmp$ g++ t.cpp
t.c: In function ‘int main()’:
t.c:18:12: error: call of overloaded ‘ToHex(char&)’ is ambiguous
  ToHex(data);
            ^
t.c:3:5: note: candidate: int ToHex(unsigned char)
 int ToHex(unsigned char a)
     ^~~~~
t.c:9:5: note: candidate: int ToHex(short unsigned int)
 int ToHex(unsigned short a)
     ^~~~~
takk@deb9:~/tmp$ 

この時のエラーに注目です。

t.c:18:12: error: call of overloaded ‘ToHex(char&)’ is ambiguous

オーバーロード、見つかりましたね。
意味を考えて、プログラミングして、プログラミングミスの結果、エラーメッセージを確認することで、このオーバーロードの言葉の意味が定着してきます。

今回は、言葉を覚えるための、工夫でした。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA