菱形継承問題
プログラミング言語ごとにこの問題への対処法は異なる。
C++ では、デフォルトでは個々の継承経路を独立して扱う。従って D オブジェクトには実際には2つの独立した A オブジェクトが内包され、A のメンバの使用は適切に行われる。A から B への継承と A から C への継承が共に "virtual"(例えば "class B : virtual public A")である場合、C++ はこれを特別に扱い、1つの A オブジェクトだけを生成し、A のメンバは正しく動作する。仮想継承と仮想でない継承が混在した場合、唯一の仮想の A と個々の仮想でない継承経路ごとの A が存在することになる。
Common Lisp では、合理的なデフォルトの動作とそれをオーバーライドする能力を提供する。デフォルトでは、引数のクラス指定が最も具体的なメソッドが選択され、サブクラスの定義内でスーパークラスが指定された順番に従う。しかし、プログラマはこれをオーバーライドでき、メソッドごとの解決順序を指定したり、メソッド結合規則を指定したりできる。