同じシグネチャを持つ複数の継承関数はオーバーロードされない
オブジェクト指向プログラミングでは、継承によりクラスが親クラスからプロパティとメソッドを継承できます。ただし、複数の継承クラスに同じ名前の異なるシグネチャを持つ関数がある場合、一般的な問題が発生します。
問題
次のコード スニペットを考えてみましょう:
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
このコードは「foo へのあいまいな呼び出し」エラーを生成します。これは、継承された関数が複数あるために foo への呼び出しを解決できないことを示します。同じ名前ですが、シグネチャが異なります。
説明
C メンバー検索ルールに従って、クラスが複数の基本クラスから継承し、同じ名前に対して複数の宣言がある場合、非表示の宣言はすべて削除されます。結果として得られる宣言セットが異なる型のものであるか、異なる基本クラスの非静的メンバーが含まれている場合、あいまいさが発生します。
上記の例では、Base1 と Base2 の両方が foo 関数を定義していますが、シグネチャが異なります。 Derived が Base1 と Base2 から継承する場合、異なる型を持つ foo の 2 つの異なる宣言が存在します。これによりあいまいさが生じ、コンパイル エラーが発生します。
解決策
あいまいさを解決するには、using 宣言を使用して、使用する基本クラスの foo バージョンを指定します。例:
class Derived : public Base1, public Base2 { using Base1::foo; };
この using 宣言により、Base1 の foo 関数が Derived で使用されることが保証されます。
Gotcha
あなたが提供した 2 番目のコード スニペットでは、派生クラスには foo 関数 (float パラメーター付き) が 1 つだけあります。これは、Base1 の foo 関数が Derived の foo 関数によって隠蔽されているためです。したがって、d.foo(5) は、Base1 ではなく Derived から float パラメーターを使用して foo 関数を呼び出します。
したがって、タイトルの質問に答えると、同じ名前で異なるシグネチャを持つ複数の継承された関数は呼び出されません。あいまいさが生じるため、オーバーロードされた関数として扱われます。代わりに、コンパイラーは、宣言または他の手法を使用して、使用する関数を指定する明示的な解決を必要とします。
以上が名前は同じだが署名が異なる複数の継承された関数は、C ではどのように解決されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。