仮想関数とは何ですか?

仮想関数は、スーパークラスで定義された関数であり、そのサブクラスのサブクラスに完全なクラス定義を持つようにする必要があります。仮想関数は、「仮想」キーワードを使用してC ++で最も一般的に見られる仮想継承と呼ばれるオブジェクト指向のプログラミングパラダイムに依存しています。仮想関数を定義するには、2つのクラス、スーパークラスとサブクラスが必要です。スーパークラスは、関数が最初に宣言され、場合によっては定義される場所です。サブクラスは、関数がスーパークラスで定義されているかどうかに応じて、関数が定義されている場合、またはオーバーライドされています。

仮想関数は2つの方法のいずれかで定義できます。まず、それは空のボディを持ち、何もしないスタブとして定義できます。第二に、それは純粋な仮想関数として定義できます。ここで、スーパークラスのヘッダーファイルでnullとして定義されます。

両方の方法論には利点と短所があります。関数をスタブとして定義すると、すべてのサブクラスが保証されますたとえ何もしなくても、それを実装します。ただし、関数をオーバーライドしてサブクラスに適切に実装するのを忘れた場合、これを指摘するエラーや警告は表示されません。一方、純粋な仮想関数を定義するには、各サブクラスが関数の独自の定義を持つ必要があります。これが当てはまらない場合はエラーが表示されます。

ただし、仮想関数は非仮想的な関数と同じ継承ルールの対象となるため、2つ以上のレベルの継承階層は、仮想関数の明示的な定義を必要としない場合があります。たとえば、サブクラスBに実装されている仮想関数を宣言するクラスAを宣言するクラスBは独自のサブクラスを宣言するクラスCを考慮することができます。クラスCはクラスAの関数の明示的な定義を必要としません。または、クラスBの機能をオーバーライドしながら、それを呼び出すこともできます。

他の極端な場合、仮想関数は、そのサブクラスで仮想と宣言されている場合、サブクラスで定義する必要はありません。たとえば、仮想関数を宣言し、2つのサブクラス、BとCの2つのサブクラスを持つクラスAを考慮することができます。さらに、クラスBにはサブクラスDとEがあり、サブクラスCにはサブクラスFとGがあります。

クラスBからGすべてのクラスAの仮想関数が何らかの形で定義されている必要があります。クラスBにAの関数が実装されている場合、クラスDとEはそれをやり直す必要はありません。おそらく、CのサブクラスはAの関数を実装する必要がありますが、どちらも何か違うことをしているため、クラスC自体で関数を定義することは役に立ちません。その場合、関数はクラスCで仮想と宣言される場合があり、実装は必要ありません。

仮想関数は学習が困難になる可能性がありますが、適切に使用すると、コードの複製を減らし、コードを理解しやすくすることができます一般的に。ただし、特に複数の継承に関しては、仮想関数には多くの落とし穴があります。複数の継承では、あいまいに定義された仮想関数が互いに競合する可能性があるため、その文脈では注意して使用する必要があります。

他の言語

この記事は参考になりましたか? フィードバックをお寄せいただきありがとうございます フィードバックをお寄せいただきありがとうございます

どのように我々は助けることができます? どのように我々は助けることができます?