オブジェクト指向プログラミングでは、オーバーロード解決は、複数のメソッドが存在する場合に正しいメソッドを選択できるようにする重要なメカニズムです。同じ名前でパラメータが異なるメソッドがクラス階層内に存在します。ただし、C でのオーバーロード解決の動作には、プログラマからの追加の指導が必要な場合があります。
次の例を考えてみましょう。
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(); // Explicit call to base class method // b->DoSomething(); // Compiler error: DoSomething() is ambiguous delete b; return 0; }
この例では、「DoSomething」という名前の 2 つのメソッドが存在します。 1 つは基本クラス A に、もう 1 つは派生クラス B にあります。オーバーロード解決では、コンテキストと引数リストに基づいてどのメソッドを呼び出すかが自動的に決定されます。ただし、この場合、コンパイラは 2 行目にエラーを生成します。
これは、デフォルトでは、C が名前の一致に対して可能な限り最小のスコープのみを考慮するためです。この例では、コンパイラは派生クラス B の DoSomething(int) メソッドを認識し、それを引数リストと照合しようとしますが、失敗します。基本クラス A のメソッドは、名前一致ステップが完了するまで考慮されません。
この曖昧さを解決するには、構文 b->A::DoSomething() を使用して基本クラスのメソッドを明示的に指定する必要があります。これにより、派生クラスに同じ名前のメソッドが存在する場合でも、基本クラスのメソッドを呼び出す必要があることがコンパイラに明示的に通知されます。
代わりに、using 宣言を使用して基本クラスを呼び出すこともできます。
class B : public A { public: using A::DoSomething; // … };
のように、メソッドを派生クラスのスコープに追加します。これにより、明示的な A:: プレフィックスなしで A の DoSomething() メソッドを呼び出すことができます。ただし、この解決策はクラス階層内の他の仮想メソッドに影響を与える可能性があることに注意することが重要です。
以上がC ではなぜ基本クラス メソッドの明示的なオーバーライドが必要なのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。