次の継承構造が C++ で正当でないのはなぜですか?
- Son1 は Father1 から派生する
- Son2 は、Father1 から派生します。
- GrandSon1 は Son1 と Son2 から派生します
これが正当である場合 (おそらく、GrandSon1 を除くすべてのクラスが純粋仮想である場合) がある場合、それらは何であり、どのようにして生じるのでしょうか?
次の継承構造が C++ で正当でないのはなぜですか?
これが正当である場合 (おそらく、GrandSon1 を除くすべてのクラスが純粋仮想である場合) がある場合、それらは何であり、どのようにして生じるのでしょうか?
あなたは間違っています。これは C++ では完全に合法です。ただし、仮想継承を検討する場合があります。
この継承階層は死のダイアモンドと呼ばれ、仮想継承を使用する場合は C++ で合法ですが、通常はまだ問題があります。
これは C++ ダイヤモンド問題です。
これは典型的な継承ダイヤモンドです。これは、iostream が istream と ostream の両方から派生し、これらの両方が ios_base から派生する標準ライブラリでも発生します。
さまざまな問題があります。
親が仮想メソッドを持っていて、Son1 と Son2 の両方がそれを実装する場合、Grandson もそれを実装しない限り、Son1 と Son2 のどちらのメソッドを実装するかを指定する必要があります。
父がデータ メンバーを持っている場合、孫はそれらを 2 回取得します。
いずれにせよ、Father には v-table があるため、そのコピーを 2 つ取得しているようです。
したがって、中間クラスは通常、仮想継承を使用しますが、これは注意が必要ですが、事実上、最終クラスのみが基本クラスを取得することを意味します。したがって、この場合、Grandson 自体が Father を作成する責任があり、それを「持っている」と想定されます。
ポインターをキャストする場合は、さらに注意すべき問題があります。特にボイドへのキャストとボイドからのキャストには注意してください*。
クラス階層とクラスインスタンスを混同していると思います。
「孫」クラスは「息子」クラスから派生できますが、「孫」のインスタンスはクラス「息子」の2つのインスタンスから派生することはできません。
いずれにせよ、ある時点で「孫孫」と「孫孫」のクラスになるので、そうするべきではないと思います。
別の方法で、親と兄弟の間の関係を出荷します。