派生クラスのオーバーロードされたメソッドに明示的なメソッド呼び出しが必要なのはなぜですか?
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?
