C オーバーロード解決: 明示的なメソッド選択が必要
C では、オーバーロード解決は引数の型とメソッドが含まれるスコープに基づいて行われます。と宣言されています。メソッドを正確に選択するために、特定のシナリオでは明示的なメソッド呼び出しが必要です。
次の例を考えてみましょう。
<code class="cpp">class A { public: int DoSomething() { return 0; } }; class B : public A { public: int DoSomething(int x) { return 1; } }; int main() { B* b = new B(); b->A::DoSomething(); // Why this? // b->DoSomething(); // Why not this? (Compiler error) delete b; return 0; }</code>
ステートメント b->A::DoSomething(); はなぜですか。必要ですか?
オーバーロードの解決について:
この場合、コンパイラーはオーバーロードの解決を実行するときにメソッドのスコープを考慮します。デフォルトでは、現在のクラスのスコープ内でメソッドの一致のみが検索されます。クラス B では、コンパイラは、単一の int 引数を受け入れる現在のスコープ内で DoSomething(int) を見つけます。
明示的な呼び出しが必要です:
ただし、親クラスA は、引数をとらないバージョンの DoSomething() も宣言します。派生クラス B でこのメソッドにアクセスするには、クラス スコープ演算子 (A::) を使用して明示的に呼び出す必要があります。
ステートメント b->DoSomething();コンパイラは、クラス B のスコープ内で引数のない DoSomething() という名前のメソッドを見つけることができないため、コンパイルに失敗します。コンパイラは、DoSomething(int) が目的のメソッドであると誤って想定します。
解決策:
この問題に対処するための 1 つの解決策は、クラス B に using 宣言を導入することです。これにより、DoSomething() メソッドが親クラスから派生クラスのスコープにプルされます。
<code class="cpp">class B : public A { public: using A::DoSomething; // … };</code>
この変更により、オーバーロード解決で目的の DoSomething() メソッドを正しく識別できるようになり、b->A::DoSomething(); を使用した明示的な呼び出しが不要になりました。
以上が派生クラスのオーバーロードされたメソッドに明示的なメソッド呼び出しが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。