ホームページ > バックエンド開発 > C++ > オーバーロードされた関数による多重継承が C のあいまいさにつながるのはなぜですか?

オーバーロードされた関数による多重継承が C のあいまいさにつながるのはなぜですか?

Patricia Arquette
リリース: 2024-12-15 14:59:10
オリジナル
196 人が閲覧しました

Why Does Multiple Inheritance with Overloaded Functions Lead to Ambiguity in C  ?

異なる型の多重継承による関数のオーバーロード

オブジェクト指向プログラミングでは、多重継承により、サブクラスが複数のメソッドと属性を継承できます。親クラス。ただし、複数の親クラスが同じ名前でシグネチャが異なるメソッド (オーバーロードされた関数) を定義すると、関数呼び出し中にあいまいさが生じる可能性があります。この記事では、同じ名前で異なるシグネチャを持つオーバーロードされた関数が多重継承の場合にそのように扱われない理由を説明し、考えられる解決策を検討します。

問題の説明

考慮事項次のコード スニペット:

#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'
}
ログイン後にコピー

この例では、派生クラスは 2 つのオーバーロードされた foo() 関数を継承します。その親クラスである Base1 と Base2 から。ただし、 d.foo(5) を呼び出そうとすると、コンパイラがどの foo() 関数を呼び出すかを決定できないため、あいまいな呼び出しエラーが発生します。これは、両方の関数の名前は同じですが、引数の型が異なるためです。

継承における関数のオーバーロードについて

関数のオーバーロードにより、クラスに同じ名前の複数のメソッドを持たせることができます。ただしパラメータが異なります。オーバーロードされた各関数は、引数の数、型、順序に基づいて区別されます。単一継承のコンテキストでは、関数のオーバーロードは期待どおりに機能します。コンパイラは、関数呼び出しで使用される引数の型に基づいて適切な関数を選択します。

多重継承と曖昧さ

ただし、多重継承の場合、関数検索のルールはより複雑になります。関数名がクラス C で検索されると、コンパイラーは C とその基本クラスでのその関数のすべての宣言を考慮します。同じ関数の複数の宣言が見つかった場合、派生クラス内の別の宣言によって隠されている宣言はすべて削除されます。

残りの宣言がすべて同じ型のサブクラスからのものではない場合、またはセットに非静的メンバーと異なるサブクラスのメンバーを使用すると、あいまいさが発生し、プログラムの形式が正しくないと考えられます。これは、まさに前の例の状況です。d.foo(5) は Base1::foo(int) と Base2::foo(float) の両方を呼び出し、結果としてあいまいさが生じます。

あいまいさの解決

曖昧さを解決してコードを有効にするための 1 つの解決策は、using 宣言を使用することです。 using 宣言は、別のクラスの名前に関連付けられた名前を現在のクラスのスコープに導入します。上記の例では、次のものが使用できます。

struct Derived : public Base1, public Base2 {
    using Base1::foo;
    using Base2::foo;
};
ログイン後にコピー

using 宣言を明示的に使用することで、各基本クラスからどのバージョンの foo() を使用するかを指定します。これによりあいまいさが解決され、コードが正常にコンパイルできるようになります。

フォールバック動作

foo(float) 関数が派生クラスのスコープ内で定義されているため、元の質問の 2 番目のコード スニペットがエラーなしでコンパイルされることは注目に値します。したがって、 d.foo(5) が呼び出されると、曖昧さなく Derived::foo(float) に解決されます。

以上がオーバーロードされた関数による多重継承が C のあいまいさにつながるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート