2011-07-28 93 views
32

我試圖實現一個實現了很多接口的相當大的對象。其中一些接口是純虛擬的。我可能在鑽石繼承方面存在問題。 Visual Studio報告了C4250 ('class1' : inherits 'class2::member' via dominance)的警告。首先,所有這些類都是按照它應該的那樣實際繼承的。以下是導致此問題的部分類設計。通過優勢警告的C++繼承

A  B  C 
\ /\ /
    \ / \ /
    AB  BC 
    |   | 
    |  BC2 
    |   | 
    \  D: Implementation of B, C, BC, BC2 
     \ /
     Big 

在這整個樹中只有D實現虛擬方法,沒有其他方法的定義。 B的所有虛擬方法都列在警告中。如果重要,D是一個完整的類。

我讀過這種情況發生在Boost序列化中,並且忽視警告是安全的。

這是我試圖實現的有效方法嗎?忽視這個警告是否安全?

注1:這不是Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance)的重複,我嘗試過那裏提出的解決方案。

注2:我也可以發送類圖,但它比這更復雜一點。

編輯: 已滿警告如下:

warning C4250: 'gge::resource::ImageResource' : inherits 
'gge::graphics::ImageTexture::gge::graphics::ImageTexture::drawin' 
via dominance 

gge::resource::ImageResource是圖中的大,gge::graphics::ImageTexture是d,DRAWIN是六種方法我得到的警告之一。

+0

實現許多接口是一個跡象,表明你的班級可能有太多的責任。考慮將其重構爲幾個較小的類。 – hammar

+0

@hammar:我試過了,但問題不在於課程,Big只是一個圖像,但有很多接口支持許多不同類型的圖形。需要特定接口服務的功能應使用滿足其需求的最小接口。作爲示例,使用這些屬性,我可以將粒子系統替換爲鼠標指針。總之我不能分成小班。 –

+1

考慮裝飾模式(http://en.wikipedia.org/wiki/Decorator_pattern)作爲子類的替代方案。 –

回答

16

一切都是絕對有效的。允許編譯器警告有效代碼,這裏沒有問題。您可以嘗試使用using聲明來消除警告。如果這不起作用(可能是由於MSVC錯誤),請用pragma將其靜音。

+0

如果使用工作,我不會問這個問題,雜注應該做的伎倆。感謝你的回答。 –

+0

我聽說有些人使用''工作或失敗,取決於源文件中的非顯着空白。如果這是真的,那裏肯定有一個編譯器錯誤。 –

+0

請顯示使用聲明的代碼。 –