言語 : C/C++
問題 : 一般的な例を挙げると、
- Aは親クラスです。
- BとCはどちらもクラスAから継承されています。
- DはBとCの両方から継承されます
Dのオブジェクトを介してAの関数にアクセスしたい
注: これは仮想継承です。したがって、 A のオブジェクトは 1 つしかないことがわかります。
問題は、 BまたはCが最初に作成するオブジェクトはどれかということです。
ヒエラルキーを意識する
A
/ \
B C
\ /
D
言語 : C/C++
問題 : 一般的な例を挙げると、
Dのオブジェクトを介してAの関数にアクセスしたい
注: これは仮想継承です。したがって、 A のオブジェクトは 1 つしかないことがわかります。
問題は、 BまたはCが最初に作成するオブジェクトはどれかということです。
ヒエラルキーを意識する
A
/ \
B C
\ /
D
つまり、OO 自体にはこれに関する保証はありません。
特定の実装または言語について話している場合(ただし、質問はそうではありません)、これに関する保証があるかもしれません。
ええ、この問題は、死のダイヤモンドとしてアポストロフィされることもあります。
残念ながら、あなたの質問には答えられません。それは、あなたがプログラミングしている現在の言語に基づいています.
たとえば、Scala (トレイトに複数の継承が許可されている) では、線形化アルゴリズムに沿ったインスタンス化のための非常に厳格な規則があり、適切な詳細を見つけることができます。
あなたはC++で遊んでいると思います。それが正しい場合は、 C++ FAQの適切なセクションを参照してください(問題はそこにも記載されています)。
C++ とクラスのインスタンス化の順序について話している場合、それは宣言の継承順序に依存します。
だから、
class D : public B,public C
B が最初にインスタンス化され、次に C がインスタンス化されます。
class D : public C,public B
C が最初にインスタンス化され、次に B がインスタンス化されます。