ホームページ >バックエンド開発 >C++ >C の継承で「派生クラスに同じ名前だが異なるシグネチャを持つ関数が見つかりません」というエラーが発生するのはなぜですか?

C の継承で「派生クラスに同じ名前だが異なるシグネチャを持つ関数が見つかりません」というエラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-21 03:40:09741ブラウズ

Why Does

クラス階層に隠蔽された関数: 「派生クラスに同じ名前だが異なるシグネチャを持つ関数が見つかりません」エラーについて

オブジェクト指向プログラミングでは、派生クラスは継承できます。基本クラスのメンバー。ただし、名前は同じでシグネチャが異なる関数が基本クラスと派生クラスの両方に存在する場合、問題が発生する可能性があります。これにより、「派生クラスに同じ名前だが異なるシグネチャを持つ関数が見つかりません」などのエラーが発生する可能性があります。

この問題を説明するには、次のコード スニペットを考慮してください。

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Error: no matching function
    }
};

コンパイル時このコードでは、コンパイラはクラス C の bar() 関数内の foo(s) 呼び出しでエラーを検出します。 foo(string s) 関数が基本クラス A に存在するにもかかわらず、コンパイラは失敗します。 関数隠蔽として知られる現象により、それを認識します。

このシナリオでは、クラス B で定義された foo(int i) 関数は、クラスから継承された foo(string s) 関数を隠します。 A. これは、クラス階層内の名前の検索が、一致する名前の最初の宣言で停止するためです。したがって、検索プロセスがクラス B に到達すると、foo(int i) 関数が見つかり、基本クラスでオーバーライドされた foo(string s) 関数は無視されます。

この問題を解決するには、明示的に派生クラスのスコープ内の基本クラス関数。 using キーワードを使用して基本クラス関数を継承すると、派生クラスとそのサブクラス内で両方の関数が表示されるようになります。

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
    using A::foo; // Redeclare base class foo function
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Now finds the base class foo(string s)
    }
};

この行をクラス B に組み込むことにより、名前検索では foo( int i) 関数と foo(string s) 関数を追加し、関数の隠蔽問題を解決しました。

以上がC の継承で「派生クラスに同じ名前だが異なるシグネチャを持つ関数が見つかりません」というエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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