多重継承を伴うオーバーロード関数のあいまいさ
オブジェクト指向プログラミングでは、多重継承により派生クラスが複数の基本クラスから継承できるようになります。ただし、これにより、名前は同じだがシグネチャが異なる複数の継承関数によってコンパイル中にあいまいさが生じる可能性があります。
次のコード スニペットを考えてみましょう。
struct Base1{ void foo(int){ } }; struct Base2{ void foo(float){ } }; struct Derived : public Base1, public Base2{ }; int main(){ Derived d; d.foo(5); }
ここでは、派生クラスは、異なるパラメータ型を持つ Base1 と Base2 の両方から foo() 関数を継承します。 d.foo(5) への呼び出しが main 関数で行われると、コンパイラはどの関数を呼び出すかを決定できず、「foo への曖昧な呼び出し」というエラーが発生します。
メンバー検索ルールの仕組みあいまいさを判断する
このあいまいさの背後にある理由を理解するには、C で定義されているメンバー検索ルールを確認する必要があります。 標準。コンパイラは関数の定義を検索するとき、まずクラスとその基本クラス内の関数のすべての宣言を考慮します。ただし、同じ名前で異なるクラスからの宣言が複数ある場合は、非表示の宣言や異なるサブオブジェクトからの宣言が削除されます。
複数の継承関数の場合、残りの宣言が同じ型に属していないか、異なるサブオブジェクトの非静的メンバーが含まれている場合、検索の結果はあいまいになります。これは、指定されたコード スニペットで直面する状況です。
あいまいさの解決
この状況でのあいまいさを解決するには、いくつかの方法があります。
指定されたコード スニペットでは、派生クラスのスコープ内に foo() 関数が 1 つだけあるため、2 番目の例は機能します。 。 d.foo(5) の呼び出しは、実際には void foo(float) 関数を呼び出します。
結論
異なるシグネチャを持つ複数の継承関数により、コンパイル中にあいまいさが生じる可能性があります。メンバー検索ルールを理解し、完全修飾呼び出しや宣言の使用などの手法を使用すると、これらのあいまいさを解決し、関数を適切に呼び出すことができます。
以上がC で多重継承を伴うオーバーロードされた関数のあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。