仮想関数の説明: その概要と純粋な仮想関数との違い
オブジェクト指向プログラミングにおける仮想関数の概念実行時ポリモーフィズムに不可欠です。仮想関数は、派生クラスでオーバーライドして、クラス階層のさまざまなレベルでさまざまな実装を提供できる関数です。
仮想関数と非仮想関数の主な違いは、最も派生されたバージョンであることです。仮想関数がオーバーライドされるときに、クラス階層のすべてのレベルで使用されます。対照的に、非仮想関数の機能は、派生クラスでオーバーライドされても、基本クラスでは変更されません。
仮想関数の動作を説明する例を次に示します。
struct Base { virtual ~Base() = default; virtual void foo() { std::cout << "Base::Foo" << std::endl; } }; struct Derived final: Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
このコードを実行すると、次の出力が生成されます:
Base::Foo Derived::Foo Derived::Foo
ご覧のとおり、foo() 関数がDerived クラスのインスタンスで呼び出される場合、基底クラス ポインター (Base* 派生_as_base) を介してインスタンスにアクセスする場合でも、Derived::foo() 実装が使用されます。
純粋な仮想関数: A特殊なケース
純粋仮想関数は、派生クラスで実装する必要がある仮想関数です。これは基本クラスでは定義されていないため、派生クラスでオーバーライドしてクラスを具体化する必要があります。 1 つ以上の純粋仮想関数を持つクラスは抽象とみなされ、直接インスタンス化できません。
純粋仮想関数の例を次に示します。
struct Base { virtual ~Base() = default; virtual void foo() = 0; }; struct Derived final: Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
この場合、クラス Base は次のとおりです。純粋な仮想関数 foo() が含まれているため、abstract になります。このクラスを使用するには、派生クラスで foo() 関数を実装し、派生クラスをインスタンス化できる具象クラスにする必要があります。
要約すると、仮想関数を使用すると、さまざまなレベルで基本クラスの機能をオーバーライドできます。一方、純粋仮想関数は、クラスを具体化するために特定の機能を実装する派生クラスを必要とします。これらの概念を理解することは、オブジェクト指向プログラミングで拡張可能でポリモーフィックなコードを記述するために非常に重要です。
以上が仮想関数と純粋仮想関数: 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。