6

C ++では、戻り型に基づくメソッドのポリモーフィズムは許可されていません。ただし、暗黙の変換メンバー関数をオーバーロードする場合、これは可能と思われます。

誰かが理由を知っていますか?演算子は内部的にメソッドのように扱われると思いました。

編集:ここに例があります:

struct func {
    operator string() { return "1";}
    operator int() { return 2; }
};

int main( ) {
    int x    = func(); // calls int version
    string y = func(); // calls string version
    double d = func(); // calls int version
    cout << func() << endl; // calls int version
}
4

4 に答える 4

11

変換演算子は実際には異なるオーバーロードとは見なされず、戻り型に基づいて呼び出されることはありません。コンパイラーは、必要な場合(型に互換性がなく、変換する必要がある場合)、またはキャスト演算子でそれらの1つを使用するように明示的に要求された場合にのみそれらを使用します。

意味的には、コードが実行しているのは、単一の演算子のオーバーロードではなく、いくつかの異なる型変換演算子を宣言することです。

于 2009-07-14T22:58:18.223 に答える
3

それはリターンタイプではありません。それが型変換です。

考えてみてください。func()はfunc型のオブジェクトを作成します。どのメソッド(コンストラクター)が呼び出されるかについては、あいまいさはありません。

残っている唯一の問題は、それを目的のタイプにキャストできるかどうかです。コンパイラに適切な変換を提供したので、満足しています。

于 2009-07-14T22:56:40.177 に答える
1

結果タイプの関数のオーバーロードを防ぐ技術的な理由は実際にはありません。これは、たとえばAdaのような一部の言語で行われますが、暗黙の変換(および2種類の変換)もあるC ++のコンテキストでは、ユーティリティが減少し、両方の機能の相互作用がすぐにあいまいになります。

暗黙的な変換はユーザー定義可能であるという事実を使用して、結果タイプのオーバーロードをシミュレートできることに注意してください。

class CallFProxy;
CallFProxy f(int);

class CallFProxy {
   int myParameter;
   CallFProxy(int i) : myParameter(i) {}
public:
   operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
   operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
于 2009-07-15T13:00:48.140 に答える
0

過負荷解決は、複数の候補機能から選択します。このプロセスでは、候補者の返品タイプは実際には考慮されません。ただし、変換演算子の場合、「リターンタイプ」は、その演算子が候補であるかどうかを判断する上で非常に重要です。

于 2009-07-15T11:53:32.237 に答える