Skip to main content

仮想関数とは何ですか?

仮想関数は、スーパークラスで定義された関数であり、そのサブクラスのサブクラスに完全なクラス定義を持つようにする必要があります。仮想関数は、仮想キーワードを使用してC ++で最も一般的に見られる仮想継承と呼ばれるオブジェクト指向プログラミングパラダイムに依存しています。仮想関数を定義するには、2つのクラス、スーパークラスとサブクラスが必要です。スーパークラスは、関数が最初に宣言され、場合によっては定義される場所です。サブクラスは、関数が定義されている場所です—または、関数がスーパークラスで定義されているかどうかに応じて、オーバーライドされます。まず、それは空のボディを持ち、何もしないスタブとして定義できます。第二に、それは純粋な仮想関数として定義できます。ここで、スーパークラスヘッダーファイルのnullとして定義されます。fother両方の方法論には利点と短所があります。関数をスタブとして定義することで、すべてのサブクラスに何もしなくても、それを実装することが保証されます。ただし、関数をオーバーライドしてサブクラスに適切に実装するのを忘れた場合、これを指摘するエラーや警告は表示されません。一方、純粋な仮想関数を定義するには、各サブクラスが関数の独自の定義を持つ必要があり、これがそうでない場合はエラーが表示されます。仮想関数、そのため、2つ以上のレベルを持つ継承階層は、仮想関数の明示的な定義を必要としない場合があります。たとえば、サブクラスBに実装されている仮想関数を宣言するクラスAを宣言するクラスBが独自のサブクラスを持っているクラスCを考慮することができます。クラスCは、クラスとしての明示的な定義を関数として必要としません。クラスBからの定義は、必要に応じて、クラスCがクラスBS関数をオーバーライドするか、クラスBS関数を上書きしながら呼び出すこともできます。extreme他の極端では、仮想関数は、そのサブクラスで仮想と宣言されている場合、サブクラスで定義する必要はありません。たとえば、仮想関数を宣言し、2つのサブクラス、BとCの2つのサブクラスを持つクラスAを考慮することができます。さらに、クラスBにはサブクラスDとEがあり、サブクラスCにはサブクラスFとGがあります。bからGを介してすべて、仮想関数が何らかの形で定義されているようにクラスが必要です。クラスBにAS機能の実装がある場合、クラスDとEはそれをやり直す必要はありません。おそらく、CSサブクラスは関数として実装する必要がありますが、どちらも何か違うことをしているため、クラスC自体の関数を定義することは役に立ちません。その場合、関数はクラスCで仮想と宣言され、実装は必要ありません。。ただし、特に複数の継承に関しては、仮想関数には多くの落とし穴があります。複数の継承では、あいまいに定義された仮想関数が互いに対立する可能性があるため、その文脈では注意して使用する必要があります。