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