ホームページ >バックエンド開発 >C++ >C ではなぜ基本クラス メソッドの明示的なオーバーライドが必要なのでしょうか?

C ではなぜ基本クラス メソッドの明示的なオーバーライドが必要なのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 14:35:29723ブラウズ

Why Does C   Require Explicit Overriding for Base Class Methods?

C オーバーロード解決: 明示的なオーバーライドの必要性を理解する

オブジェクト指向プログラミングでは、オーバーロード解決は、複数のメソッドが存在する場合に正しいメソッドを選択できるようにする重要なメカニズムです。同じ名前でパラメータが異なるメソッドがクラス階層内に存在します。ただし、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 サイトの他の関連記事を参照してください。

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