2017-04-18 191 views
1

我正在使用具有兩個大型繼承樹的數學軟件框架。這在概念上受到啓發:一個是用於一般功能(它們繼承自Func),另一個用於歸一化概率密度函數(它們繼承自Pdf)。具有不同繼承性的同一類的版本

但是,有一些原則上應該存在於兩個層級中的類,例如Gauss函數。

目前,有一個GaussFuncGaussPdf類具有相同的源代碼實現方式中,除了類名,並從分別FuncPdf,繼承。

我想通過擺脫源代碼的第二個副本來改善這種情況。我可以想出幾種方法來解決這個問題,而不會弄亂整個繼承樹,例如使用預處理器宏和#include語句,或者可能是模板,但我不確定在這種情況下做什麼是最可取的事情情況。

任何有關如何在這種情況下進行的建議都非常受歡迎。但是,請注意,我無法重構整個軟件項目以先驗地避免此問題(這當然是最爲理智的方法,但在我的工作時間範圍內不可能,並且不在我允許決定的範圍內關於)。

+2

這聽起來像繼承的濫用。很難說沒有源代碼。 – imreal

+1

聽起來像Pdf不應該是單獨的層次結構,而是主層次結構的某些適配器(基於模板?) – Swift

+0

@imreal:源代碼的哪些細節會很有趣?整個課程的源頭是〜2000行,所以粘貼這一切都超出了我所假設的範圍:-) – carsten

回答

1

只是模板化要繼承,像這樣的類:

template<typename Base> 
class MetaGauss : public Base 
{ 
    ... 
}; 

typedef MetaGauss<Func> GaussFunc; 
typedef MetaGauss<Pdf> GaussPdf; 

這裏有一個現場演示:

http://ideone.com/XD4E6y

相關問題