2017-06-05 57 views
0

二進制文件我有相似的情況下,以C++編寫,從多重繼承類

「死亡的金剛石」我有類B和C實際上繼承類A, 並且還類d其中繼承的類B和C.

A 
/\ 
B C 
\/ 
    D 

乙& C已繼承的成員,並且也自己的成員。 D只有繼承的成員。

我正在寫保存方法,獲取ofstream並應該將對象寫入二進制文件。

和一個Load方法,該方法獲取ifstream並應從二進制文件創建對象。

的方法是虛擬的,並寫在這樣一種方式,每個類的方法只能處理特定類成員負載&保存(並使用繼承類的方法的繼承成員的其餘部分)寫時

現在保存方法d,基本上我只需要做到:

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

顯然,這將導致A.save()被調用這兩次會導致被寫入文件兩次

我想像添加一個saveOnly方法到B和C將只保存其成員(而不是A)是愚蠢的東西

所以我想知道什麼是這種情況下的最佳實踐?

+1

歡迎來到Stack Overflow。請花些時間閱讀[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()。這可以解決這種情況下的問題,但是如果您製作像這樣的繼承鑽石,您將會遇到更多像這樣的問題。