ホームページ > バックエンド開発 > C++ > オーバーライドするかしないか: C で仮想関数をオーバーライドする場合、「virtual」を明示的に宣言する必要がありますか?

オーバーライドするかしないか: C で仮想関数をオーバーライドする場合、「virtual」を明示的に宣言する必要がありますか?

Mary-Kate Olsen
リリース: 2024-12-14 22:04:15
オリジナル
246 人が閲覧しました

To Override or Not to Override: Is Explicitly Declaring

派生 C クラスでの仮想関数のオーバーライド: 必要かどうか?

C は、派生クラスで多態性の動作を有効にする「virtual」キーワードを提供します。ポリモーフィズムにより、異なるクラスで同じ関数の異なるバージョンを実装できます。ただし、次のような疑問が生じます。派生クラスで仮想関数をオーバーライドするときに、「virtual」を指定する必要がありますか?

次の構造体の定義を考えてみましょう:

struct A {
    virtual void hello() = 0;
};
ログイン後にコピー

これは抽象を定義します。純粋な仮想関数 hello() を備えた基本クラス A。ここで、派生クラス B でこの関数をオーバーライドする 2 つのアプローチを調べてみましょう:

Approach #1:
struct B : public A {
    virtual void hello() { ... }
};
ログイン後にコピー
Approach #2:
struct B : public A {
    void hello() { ... }
};
ログイン後にコピー

問題は、これら 2 つのアプローチに違いはありますか?

答え:

答えは「いいえ」です。これら 2 つのアプローチの間に動作の違いはありません。ただし、その使用法には微妙な違いがあります。

  • アプローチ #1: オーバーライドされた関数を「仮想」として明示的に指定します。これは、基本クラスの 1 つで仮想として宣言されている派生クラスの仮想関数をオーバーライドする場合に必要です。この場合、「virtual」を使用すると、関数のオーバーライドが多態的に行われることが保証されます。
  • アプローチ #2: オーバーライドされる関数を「virtual」として明示的に指定しません。これは、オーバーライドされた関数が基本クラスですでに virtual として宣言されている場合に有効です。この場合、「virtual」キーワードは暗黙的に継承され、オーバーライドが多態的になります。

この例では、オーバーライドされた関数は基本クラス A ですでに virtual として宣言されています。したがって、両方のアプローチは次のようになります。その結果、多態性の動作が発生します。 2 つのアプローチのどちらを選択するかは、コードの明確さと一貫性によって決まります。

以上がオーバーライドするかしないか: C で仮想関数をオーバーライドする場合、「virtual」を明示的に宣言する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート