同じ名前の複数の継承関数: オーバーロードしない理由
C では、複数のクラスが同じ名前で異なるシグネチャを持つ関数を継承する場合の場合、コンパイラはこれらの関数をオーバーロードされた関数ではなく個別のメンバーとして扱います。これにより、派生クラスから関数を呼び出すときにあいまいさが生じます。
次の例を考えてみましょう。
struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { };
ここでは、Base1 と Base2 の両方で、異なるパラメーターを持つ foo という名前の関数が定義されています。派生クラス Derived から d.foo(5) を呼び出すと、コンパイラは「あいまいな呼び出し」エラーを発生させます。
関数のシグネチャが同一である必要があるオーバーライドとは異なり、オーバーロードでは同じ名前の関数を使用できますが、異なるパラメータ。ただし、この規則は複数の継承関数には適用されません。
C メンバー検索規則によれば、同じメンバー名の複数の宣言が派生クラスに存在する場合、異なる基本クラスからの宣言はあいまいであるとみなされます。これは、宣言がすべて同じ型のサブオブジェクトからのものではない場合、または別個のサブオブジェクトからの非静的メンバーがある場合に発生します。
この曖昧さを解決するには、using 宣言を使用して明示的に指定できます。どの基本クラスの関数を呼び出す必要があるか:
struct Derived : public Base1, public Base2 { using Base1::foo; using Base2::foo; }; int main() { Derived d; d.foo(5); // Calls Base1::foo(int) d.foo(5.0f); // Calls Base2::foo(float) }
2 番目のコード スニペットでは、提供:
struct Base { void foo(int); }; struct Derived : public Base { void foo(float); };
Derived の関数 foo(float) は、基本クラスの foo(int) 関数をオーバーライドします。したがって、d.foo(5) を呼び出すと、foo(float) 関数は曖昧さなく正しく呼び出されます。
以上が同じ名前を持つ複数の継承関数が C でオーバーロードされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。