継承 (プログラミング)
一方、仮想継承した場合、DerivedVのインスタンスにはBaseの部分はただ1つしか存在しない。DerivedV1の基底とDerivedV2の基底が共有されている状態である。
先発OOP言語のC++やEiffelでは実装の多重継承ができたが、後発言語のJavaやC#では実装は単一継承限定にされ、代わりにインターフェースの多重継承(界面の多重継承)が導入されている。なぜなら実装の多重継承はメリットよりもデメリットのほうが多いとみなされたためである。
継承関係が複雑になるため全体の把握が困難になる。
名前の衝突。同じ名前を複数の基底クラスがそれぞれ別の意味で用いていた場合、その両方を派生クラスでオーバーライドするのが困難。
処理系の実装が複雑になってしまう。
仮想継承にしていない場合に同一の基底クラスが複数存在してしまう(これが望ましい場面もあるが)。これの何が問題かというと、最初は仮想継承していなかったものを、後から仮想継承にしたくなったときに、変更点を洗い出すのが大変になるからである。つまり仮想継承を使用するには設計をきちんと行う必要があるということである。
しかしながら多重継承を使う方が直感的になる場合もあるとの主張もあり、どちらが正しいとは言えない状況である。