菱形継承問題
クラスの多重継承ができない言語のうち、(Objective-C、PHP、C#、Javaなど)実装を持たないインタフェースのみを多重継承可能にしている言語がある(Objective-C ではプロトコルと呼ぶ)。実装を持たないため、インタフェースを多重継承しても、特定のメソッドやメンバ変数には常に1つの実装しかないので、あいまいさは発生しない。
Rubyは次のようなMixinアプローチにより菱形問題を回避している。クラスはクラスを単一継承し、クラスを多重継承することはできない。Rubyにはクラスの他にモジュールがあり、クラスはモジュールを多重継承することができる。モジュールには継承関係が無いので、菱形問題は発生しない。なお、クラスのクラス「Class」はモジュールのクラス「Module」のサブクラスである。
菱形問題は継承に限ったことではない。A、B、C、D というヘッダファイルが互いに菱形を形成するように "#include" されている場合、同様の問題が発生しうる。プリプロセッサで処理された結果、A にあった宣言が B と C で異なった形に変えられ、"#ifdef" が適切に機能しないという状況がありうる。同様に、ミドルウェアスタックでも似たような問題が発生する。A がデータベース、B と C がそのキャッシュだとした場合、D が B と C にトランザクションのコミットを要求すると、A にはコミット要求が重複して届いてしまう。