ホームページ  >  記事  >  バックエンド開発  >  この C コードでコンパイラが `b->DoSomething()` ではなく `b->A::DoSomething()` を必要とするのはなぜですか?

この C コードでコンパイラが `b->DoSomething()` ではなく `b->A::DoSomething()` を必要とするのはなぜですか?

DDD
DDDオリジナル
2024-11-05 12:37:021050ブラウズ

この C コードでは `b->DoSomething()` の代わりに

Why Does the Compiler Require `b->A::DoSomething()` を使用しますか? 
この C コードでは `b->DoSomething()` の代わりに、 />A::DoSomething()` を使用しますか?

C オーバーロードの解決

指定されたコード例では、コンパイラーは b の代わりに b->A::DoSomething() を明示的に使用する必要があります。 ->DoSomething() 「オーバーロード解決」の概念による。

オーバーロード解決は、引数の型と数に基づいてどの関数オーバーロードが呼び出されるかを決定します。この場合、コンパイラーはメソッド DoSomething() を考慮します。 ) まず、クラス B のスコープ内に同じ名前とパラメーターを持つメソッドが存在するため、コンパイラーは B 内のオーバーロードを解決しようとします。

ただし、A 内のメソッド DoSomething() はこれも有効なオーバーロードです。このオーバーロードに明示的にアクセスするには、スコープ演算子 :: を使用して、DoSomething() メソッドが基本クラス A に属することを指定します。

この問題を回避するための 1 つの解決策は、次のとおりです。 using キーワードを使用して、A から B のスコープにオーバーロードをプルダウンします。これにより、B 内で直接 A::DoSomething() にアクセスできるようになります。例を次に示します。

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // Additional methods or members
};</code>

今度は、スコープ内でB のメソッド DoSomething() は、using ディレクティブにより B 内のオーバーロードと見なされるため、A:: プレフィックスなしで呼び出すことができます。

以上がこの C コードでコンパイラが `b->DoSomething()` ではなく `b->A::DoSomething()` を必要とするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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