C++におけるOverload,Override,Hideの区分

6508 ワード

C++におけるOverload,Override,Hideの区分
一.概要
  • Overload:リロード、関数の同名を指すが、パラメータの個数が異なる、またはパラメータのタイプが異なる複数の実装.(パラメータが同じで、戻り値が異なるだけでリロードではない場合、コンパイラはエラーを報告します.)

  • コンパイラは、リロード関数を判断します.
  • の最初のステップは、呼び出しで考慮されるリロード関数の集合を決定することであり、この関数の集合を候補関数(candidant function)と呼ぶ.候補関数とは呼び出された関数と同名の関数である.
  • 第2ステップは、コンパイラが第1ステップから選択した候補関数から実行可能関数(viable function)を呼び出す2つの動作に分けられる.実行可能関数の関数パラメータの個数は呼び出した関数パラメータの個数と同じか、または実行可能関数のパラメータは多くてもよいが、多くの関数パラメータには関連するデフォルト値が必要である.2つ目の動作は、パラメータタイプの変換規則に従って呼び出された関数実パラメータを候補関数の実パラメータに変換することである.ここでは,パラメータタイプ変換を十分に利用する原則に基づいて,言い換えれば,できるだけ上パラメータタイプ変換を用いる.もちろん変換は候補関数を変換の目標とします.パラメータ変換規則に従って実行可能な関数が見つからない場合、その呼び出しはエラーであり、呼び出しと一致する関数がなく、一致しない場合に属する(no match function).
  • 第3のステップは、第2のステップで選択された実行可能関数の中から最適な実行可能関数(best match situation)を選択する.最適実行可能関数の選択では、関数の実パラメータタイプから対応する実行可能関数パラメータへの変換に等級を分け、等級の区分(ranked)に基づいて最適実行可能関数を選択します.
  • Override:(意外に適切な翻訳)継承時に親関数がvirtualとして宣言され、子クラスがその関数を再宣言して実装することを指します(関数名とパラメータは完全に同じで、戻り値は制約されません).サブクラスこの関数はvirtualとして宣言してもよいし、追加しなくてもよいし、制限しなくてもよいが、サブクラスが再ロードされ続ける場合はvirtualとして宣言したほうがよい.virtualとOverrideのメカニズムがあるからこそ,C++はマルチステートを実現できる.
  • Hide:継承構造の関数非表示.親に関数が宣言され、子に完全に一致する関数が宣言され、定義されているが、親に関数がvitualとして宣言されていない場合、子に同じ名前のパラメータ関数が親の関数を完全に非表示にします.Overrideと似ているようですが、その実現メカニズムはOverrideとは全く異なり、問題になるので避けるべきです.(virtualメカニズムは虚表(vtable)を用いて実現され、虚表は虚関数ポインタリストを維持するが、1つのオブジェクトの虚関数が呼び出された場合、虚表に行って呼び出された関数を検索し、決定し、具体的な実装は、1期のブログで説明することができる.)
  • 
         
         
         
         
    
           
           
           
           
    class Super
    {
    public:
            void go() { cout << "go() called on Super" << endl; }
    };
    class Sub : public Super
    {
    public:
            void go() { cout << "go() called on Sub" << endl; }
    };
    Sub mySub;
    mySub.go();  // output: go() called on Sub
    Super& ref = mySub;
    ref.go(); //output: go() called on Super

    サブクラスの関数を呼び出すことを望んでいるかもしれませんが、これはあなたの予想とは全く異なるかもしれません.
    二.まとめ
    オーバーロードという概念はよく知られています.同じアクセス可能領域内で名前が付けられたいくつかの異なるパラメータ列(パラメータのタイプ、個数、順序が異なる)の同名関数は、プログラムが異なるパラメータ列に基づいてどの関数を呼び出すかを決定し、このメカニズムがリロードされます.リロードは関数の戻り値タイプに関係なく、つまり戻りタイプが異なるとリロードを構成できません.また、C++のconstメンバー関数はoverloadを構成してもよい.リロードの特徴をまとめます:1、同じ空間の中で、つまり同じ範囲内にあります;2、関数名は同じです.3、パラメータが違う、すなわちパラメータの個数が違う、あるいは同じ位置のパラメータのタイプが違う.4、constメンバー関数は非constメンバー関数と重荷を形成することができる.5、virtualキーワード、戻りタイプは、リロードに十分かどうかに影響しません.
    オーバーライドオーバーライドoverrideは、生クラスに再定義が存在する関数を割り当て、その関数名、パラメータ列、戻り値タイプは親クラスの対応するオーバーライドすべき関数と厳密に一致しなければならない.オーバーライド関数とオーバーライドされた関数は関数体(カッコの部分)のみが異なる.派生クラスオブジェクトがサブクラスの同じ名前の関数を呼び出すと、親の上書きされた関数のバージョンではなく、サブクラスの上書きされたバージョンが自動的に呼び出されます.このメカニズムを上書きと呼びます.特徴は、1、異なる範囲(それぞれ派生クラスとベースクラスにある)です.2、関数の名前は同じです.3、パラメータが同じ;4、ベースクラス関数にはvirtualキーワードが必要です. 
    上記の2つの概念に対して,もう1つのhideを隠す.非表示とは、派生クラスタイプのオブジェクト、ポインタ、参照アクセスベースクラスと派生クラスの両方にある同名の関数を指す場合、アクセスするのは派生クラスの関数、すなわちベースクラスの同名の関数を非表示にすることである.隠しルールの底の原因は実はC++の名前解析過程である.継承メカニズムでは、派生クラスのクラスドメインがベースクラスのクラスドメインにネストされます.派生クラスの名前解析プロセスは以下の通りである:1、まず派生クラスドメインでその名前を検索する.2.最初のステップで名前が正常に検索されなかった場合、派生クラスのクラスドメインで名前を解析できなかった場合、コンパイラは周辺ベースクラスドメインで名前の定義を検索します.隠された特徴をまとめます:1、派生クラスの関数がベースクラスの関数と同名であるが、パラメータが異なる場合.この場合、virtualキーワードの有無にかかわらず、ベースクラスの関数は非表示になります(リロードと混同しないように注意).2、派生クラスの関数がベースクラスの関数と同名で、パラメータも同じであるが、ベースクラスの関数にはvirtualキーワードがない.このとき、ベースクラスの関数は非表示になります(オーバーライドと混同しないように注意).