仮想クラスとは?

仮想クラスは、そのクラスの子がメモリ内に確立されたその親クラスの1つのコピーのみを使用するように、メモリ内に1回だけ割り当てられるクラスです。 クラスは、共通の特性または属性を共有するオブジェクトのグループです。 クラスを仮想化すると、オブジェクト指向プログラミング言語は、第2世代以上の親クラスが共通の先祖ベースクラスから派生する場合に、多重継承を使用する機能を提供します。 参照されるコンピュータープログラミング言語に応じて、「仮想」キーワード、類似キーワード、またはクラスの構文とセマンティクスを使用して、特定のクラスが仮想と見なされることを暗示します。

すべてのオブジェクト指向プログラミング言語が多重継承を許可するわけではありません。これは、子クラスを複数の親クラスから同時に派生させることができる場合です。 C ++などのプログラミング言語では、クラスは両方の親クラスからすべてのメンバーデータとメンバー関数を一度に継承し、親データと関数の両方のセットにアクセスできます。 多重継承をサポートする他の言語には、Perl、Python、Tcl、およびEiffelが含まれます。

子クラスの作成に使用される2つ以上の親クラスが元々1つまたは同じ祖父母クラスのみから派生している場合、多重継承階層で問題が発生します。 これはダイアモンド問題と呼ばれ、この状況では階層がどのように見えるかに由来する名前です。 コンパイラプログラムが、共通の祖父母を持つ2つの親クラスから作成された孫クラスなどのクラスをインスタンス化しようとすると、祖父母の2つのコピーが、親ごとに1つずつメモリに作成されます。

メモリ内の同じ祖父母の複数のコピーによって引き起こされるあいまいさのため、コンパイラは、祖父母が祖父母のデータまたは関数にアクセスするために使用する祖父母のコピーを確認することができません。 この状況を改善するために、C ++では、親を宣言するときに祖父母が仮想クラスになります。 これにより、コンパイラーは、両方の親が共有するメモリー内に祖父母のコピーを1つだけ作成します。 祖父母が仮想クラスになると、祖父母のコピーは1つしか存在しないため、コンパイラは孫が祖父母にアクセスする方法を決定するのに問題はありません。

クラス階層を構造化するとき、特に将来的にはるかに大きな階層に含まれる、またはベースになるときは、細心の注意を払う必要があります。 仮想クラスを適切に使用すると、クラス階層の開発の自由度が広がります。 ただし、見つけるのが難しいエラーを引き起こす可能性があります。 堅実なコンピュータープログラミングエンジニアリングの原則の研究は、不適切なプログラム編成による予期しない副作用が発生しないことを保証するのに役立ちます。

他の言語

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

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