ホームページ >バックエンド開発 >C++ >多重継承では、名前は同じでシグネチャが異なるオーバーロードされた関数がサポートされないのはなぜですか?

多重継承では、名前は同じでシグネチャが異なるオーバーロードされた関数がサポートされないのはなぜですか?

DDD
DDDオリジナル
2024-12-08 08:00:221014ブラウズ

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

複数の継承を持つオーバーロードされた関数

C では、関数のオーバーロードにより、同じ名前の複数の関数を単一のスコープ内で定義できます。それらには異なるパラメータリストがあります。ただし、この動作は、名前は同じでシグネチャが異なる複数の継承関数には適用されません。ここで疑問が生じます: なぜそのような関数はオーバーロードとして扱われないのでしょうか?

C 標準のセクション 10.2/2 によると、メンバー検索ルールにより、名前検索中に非表示の宣言が考慮から除外されることが規定されています。複数の基本クラスが同じ名前で異なるパラメーターを持つ関数を定義する場合、これらの関数は相互に隠蔽される可能性があります。したがって、結果の宣言セットが同じ型のサブオブジェクトからのものではない場合、または非静的メンバーと異なるサブオブジェクトからのメンバーが含まれている場合、あいまいさが生じ、プログラムは不正な形式であるとみなされます。

例:

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};

この場合、f は 2 つの異なる基本クラス (A と B) で定義されているため、あいまいです。したがって、C クラスからの次の f 呼び出しは正しくありません:

int main() {
  C c;
  c.f();  // ambiguous
}

このあいまいさを解決するには、using 宣言を使用して、どの基本クラスが f 関数を実装するかを指定できます。例:

class C : public A, public B {
     using A::f;
     using B::f;
};

この変更により、c.f() はクラス A から f を明示的に呼び出すようになり、曖昧性が解決されました。

対照的に、あなたが提供した 2 番目のコード例は、foo( float) は派生クラスのスコープ内で定義され、複数の基本クラスから継承されません。したがって、 d.foo(5) は、曖昧さなく foo(float) 関数を直接呼び出します。

以上が多重継承では、名前は同じでシグネチャが異なるオーバーロードされた関数がサポートされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。