こんにちは。
C++/C#だと、演算子オーバーロードが出てきます。
なぜオーバーライドでなくオーバーロードなのか。それはこう説明できるでしょう、複数実装を持つ同名メソッドのうち、コンパイル時に解決されるのがオーバーロード、実行時に解決されるのがオーバーライドなのである、と。
他の言語のことはよく分かりませんが、解釈が違っているように感じます。
単に「演算子」と読んだ場合、グローバル演算子を指すことが多いと思います。グローバル演算子は単なるグローバル関数ですから、引数違いで別のグローパル演算子を定義することをオーバーロードと呼ぶのは妥当と思います。
次に、例えばstd::stringのoperator+()をオーバーライドすることは可能ですので、その時はオーバーライドと呼ぶべきと思います。ただ、標準ライブラリのクラスを派生させて、更に演算子をオーバーライドするケースがあまり多くないので、「演算子をオーバーライドする」と言う表現をあまり見かけないということではないでしょうか?
また、オーバーライドも2種類あります。仮想関数をオーバーライドする場合と通常の関数をオーバーライドする場合ですね。後者はコンパイル時に解決されます。そして、前者を動的と言って良いのかどうかちょっと微妙に感じます。vtableはコンパイル時に生成されます。vtableへのポインタはコンストラクト時に設定されますが、その時は派生クラスがコンストラクトされています。
【追記】
すいません。std::string::operator+()は存在してませんでした。
代わりに、virutalなしでもオーバーライドできることをstd::string::operator+=()で確認しました。
C++
1#include<iostream>
2#include<string>
3
4class my_string : public std::string
5{
6public:
7 my_string(const char* s) : std::string(s) { }
8 my_string& operator+=(const char* s)
9 {
10 std::string::operator+=(s);
11 return *this;
12 }
13};
14
15int main()
16{
17 my_string x("abc");
18 x += "+def";
19 std::cout << x << "\n";
20 return 0;
21}
MinGW(gcc) 5.2.0とmsvc 2015でビルドと動作確認してます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/27 07:21
退会済みユーザー
2016/05/27 07:33 編集
2016/05/27 11:12 編集
退会済みユーザー
2016/06/01 04:03
2016/06/01 08:13
退会済みユーザー
2016/06/01 10:01
2016/06/01 10:12
退会済みユーザー
2016/06/01 10:21 編集
2016/06/01 10:37 編集
退会済みユーザー
2016/06/01 10:38
2016/06/01 12:04
2016/06/01 13:10 編集