我試圖實現一個實現了很多接口的相當大的對象。其中一些接口是純虛擬的。我可能在鑽石繼承方面存在問題。 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是六種方法我得到的警告之一。
實現許多接口是一個跡象,表明你的班級可能有太多的責任。考慮將其重構爲幾個較小的類。 – hammar
@hammar:我試過了,但問題不在於課程,Big只是一個圖像,但有很多接口支持許多不同類型的圖形。需要特定接口服務的功能應使用滿足其需求的最小接口。作爲示例,使用這些屬性,我可以將粒子系統替換爲鼠標指針。總之我不能分成小班。 –
考慮裝飾模式(http://en.wikipedia.org/wiki/Decorator_pattern)作爲子類的替代方案。 –