Skip to main content

仮想継承とは何ですか?

仮想継承は、スーパークラスの実装が不完全であり、オブジェクトの完全な定義にサブクラスが必要な継承の一種です。このタイプの継承は、単一および複数の継承の両方と組み合わせて使用できますが、複数の継承で最も一般的に使用されます。仮想ベースクラスから継承するクラスは、そのベースクラスの直接サブクラスになります。仮想ベースクラスは、すべてのメソッドを実装するためにサブクラスに依存する場合がありますが、これは要件ではありません。C++は、仮想継承を使用するための最も一般的に知られているコンピューター言語です。C ++で仮想継承を宣言するために、仮想キーワードが使用されます。スーパークラスとサブクラスの両方は、仮想キーワードを使用して仮想メソッドを宣言する必要があります。これにより、C ++コンパイラにスーパークラスが不完全であることがわかり、サブクラスから情報を入手して完了する必要があります。サブクラスを使用してスーパークラスを完成させることは、サブクラスが同じベースクラスを持っている場合に互いに上書きすることを意味するものではなく、代わりにC ++コンパイラが各オブジェクトにどのようなピースに合うかを判断するのに役立ちます。継承、C ++のグローバル関数は仮想と宣言することはできません。この継承タイプは、オブジェクト指向プログラミング(OOP)の原則を順守する場合にのみ使用できます。この理由は、グローバルな機能が特定のクラスに関連付けられていないため、通常は独自に自己完結型であるためです。スーパークラスとサブクラスの継承がないと発生することはできないため、グローバルな機能と仮想継承は相互に排他的です。理論的には、グローバル機能は仮想関数内で使用できますが、逆は常に機能するとは限らない場合があります。複数の継承では、2つのサブクラス、BとC、次にクラスBとCの両方から継承されるクラスDを持つ基本クラスAがある場合があります。Cはすべて同じ方法の実装を持っています。クラスDが使用する実装を決定することはできません。各クラスの実装は明確であり、したがって明確であるため、仮想継承はこの問題を解決します。この区別は、各オブジェクトタイプを追跡する仮想テーブル(VTABLES)と呼ばれる特殊な内部オブジェクトによって処理されますが、これらのテーブルは、言語に組み込まれているため、プログラマーによって明示的に操作する必要はありません。