ホームページ > バックエンド開発 > C++ > 同じ名前を持つ複数の継承関数が C でオーバーロードされないのはなぜですか?

同じ名前を持つ複数の継承関数が C でオーバーロードされないのはなぜですか?

Patricia Arquette
リリース: 2024-12-21 16:17:09
オリジナル
604 人が閲覧しました

Why Don't Multiple Inherited Functions with the Same Name Overload in C  ?

同じ名前の複数の継承関数: オーバーロードしない理由

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 サイトの他の関連記事を参照してください。

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