仮想関数と純粋仮想関数の違いは何ですか

目次:

Anonim

NS 主な違い 仮想関数と純粋仮想関数の違いは、 仮想関数は、virtualキーワードを使用して宣言される基本クラスの関数ですが、純粋仮想関数は、関数定義のない基本クラスの仮想関数です。

ポリモーフィズムは重要なOOPの概念です。これにより、オブジェクトはさまざまな形をとることができます。早期バインディングと遅延バインディングと呼ばれる多型には2つのタイプがあります。 C ++は、OOPをサポートするプログラミング言語です。したがって、プログラマーはC ++を使用してポリモーフィズムの概念を実装できます。

OOP、純粋仮想関数、仮想関数

仮想関数とは

仮想関数は、virtualキーワードを持つ基本クラスの関数です。サブクラスが他の実装と同じメソッドを持っている場合、静的リンケージがあってはならないことをコンパイラーに示すのに役立ちます。以下のプログラムを参照すると、この概念を理解しやすくなります。

図1:C ++プログラム

上記のプログラムでは、クラスAにdisplayというパブリックメソッドがあります。クラスBはクラスAを継承します。displayというメソッドがあります。どちらのメソッドも同じ名前ですが、実装が異なります。 mainメソッドでは、「a」はポインタであり、「b」はタイプBのオブジェクトです。次に、「a」にアドレスbが割り当てられます。最後に、プログラマーは「a」を使用してdisplayメソッドを呼び出すことができます。ここで、出力がクラスAの表示メソッドを示していることがわかります。プログラマーが「b」のアドレスを「a」に割り当てたとしても(b =&a)、クラスAの表示メソッドを出力します。静的リンケージへ。つまり、関数呼び出しはプログラムを実行する前に修正されます。表示機能はコンパイル時に設定されます。これを早期バインディングとも呼びます。

コンパイラーに実行時にオブジェクトのタイプを識別させ、関数呼び出しをバインドするために、プログラマーは基本クラスでキーワード「virtual」を使用できます。それを達成するために、彼は上記のプログラムに小さな変更を加えることができます。つまり、次のように、基本クラス関数の前に仮想キーワードを追加します。

図2:仮想関数を使用したC ++プログラム

これで、クラスAの表示関数は仮想関数になりました。出力にはクラスBのdisplayメソッドが表示されていることがわかります。タイプBが優先されます。つまり、オブジェクトに応じて関数が呼び出されます。したがって、これは動的バインディングまたは遅延バインディングです。

純粋仮想関数とは

仮想関数はタスクを実行しません。定義や実装のない関数は何もしない関数です。したがって、この種の関数は純粋仮想関数です。さらに、純粋仮想関数を持つクラスのオブジェクトを宣言することはできません。これらのクラスは、抽象基本クラスと呼ばれます。

図3:純粋仮想関数を使用したC ++プログラム

サブクラスは、基本クラスの仮想関数に定義を提供する必要があります。クラスAの表示関数の関数定義は必要ありません。したがって、関数定義はありません。 = 0は、関数に定義がないことをコンパイラーに示します。したがって、クラスAの表示関数は純粋仮想関数と呼ばれます。クラスAは純粋仮想関数を持っているため、抽象基本クラスと呼ばれます。

仮想関数と純粋仮想関数の違い

意味

仮想関数は、基本クラス内で宣言されたメンバー関数であり、派生クラスによって再定義またはオーバーライドできますが、純粋仮想関数は、実装されていない基本クラスの仮想関数です。したがって、これが仮想関数と純粋仮想関数の主な違いです。

関数定義

派生クラス

また、仮想関数と純粋仮想関数のもう1つの違いは、すべての派生クラスが基本クラスの仮想関数をオーバーライドする必要がないことです。ただし、派生クラスは、基本クラスの純粋仮想関数をオーバーライドする必要があります。

抽象クラス

さらに、仮想関数には抽象クラスの概念はありません。純粋仮想関数が少なくとも1つある場合、そのクラスは抽象クラスと呼ばれます。

結果

基本クラスの仮想関数をオーバーライドしない派生クラスは、コンパイルエラーを引き起こしません。ただし、基本クラスの純粋仮想関数をオーバーライドしない派生クラスは、コンパイルエラーを引き起こします。したがって、これは仮想関数と純粋仮想関数の違いでもあります。

結論

プログラマーはC ++で仮想関数を書くことができます。純粋仮想関数は、特別な仮想関数です。仮想関数と純粋仮想関数の主な違いは、仮想関数は、virtualキーワードを使用して宣言された基本クラスの関数であるのに対し、純粋仮想関数は、関数定義のない基本クラスの仮想関数であるということです。

リファレンス:

1.Codearchery。 C -50の仮想関数、Codearchery、2017年3月22日、こちらから入手できます。 2.「C仮想関数–Javatpoint」。 Www.javatpoint.com、ここで入手可能。3。「Cの仮想関数」。 GeeksforGeeks、2018年9月17日、こちらから入手できます。 4.「Cの純粋仮想関数と抽象クラス」 GeeksforGeeks、2018年9月11日、こちらから入手できます。

仮想関数と純粋仮想関数の違いは何ですか