0

を書く私はクラスBを継承、クラスBとC事実上、継承クラスA、 およびクラスDを持っており、 C.は、C++、私は「死のダイヤモンド」に似たケースを持つ複数の継承クラスからバイナリファイルに</p> <p>を

A 
/\ 
B C 
\/ 
    D 

B & Cメンバー、および、独自のメンバーを継承しています。 Dにはメンバーだけが継承されています。

私は書いています。ofstreamを取得し、Objectをバイナリファイルに書き込むメソッドを保存しています。

そして、ifstreamを取得し、バイナリファイルからオブジェクトを作成するLoadメソッド。

方法は、各クラスのメソッドを書くときにのみ、その特定のクラスのメンバーが&保存(および継承されたメンバーの残りの継承されたクラスのメソッドを使用しています)今

をロードし処理するように仮想と書かれていますDのための方法を保存し、基本的に私は実行する必要があります。

B.save(); 
C.save(); 

明らかにこれはA.saveは()を2回二回

ファイルに書き込まれるようになりますどのと呼ばれるようになります私は思いますsaveOnlyメソッドをBに追加し、Cのみメンバーを保存する(Aのものではない)は愚かです

このような場合のベストプラクティスは何ですか?

+1

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

0

ベストプラクティスは、クラス継承でダイヤモンドを作成しないことです。それは常に問題を引き起こし、避けるのが最善です。継承の各リンクを評価し、ある時点で合成を使用するか、基本クラスを純粋な仮想インタフェースにするなど、何か違うことができるかどうかを考えます。

A::save()を仮想メソッドにする代わりに、保護された純粋な仮想のA::onSave()メソッドを代わりにそれぞれの派生クラスでオーバーライドする必要があります。 A::save()は、必要な処理を行い、次にonSave()を呼び出します。 BとCはどちらもonSave()を実装し、必要な処理を行いますが、A::onSave()は呼び出されません(純粋な仮想なので)。 DはonSave()を実装し、B::onSave()C::onSave()を呼び出します。これはこのケースの問題を回避しますが、そのような継承ダイヤモンドを作成すると、このような問題が常に発生します。

関連する問題