我试图实现一个实现了很多接口的相当大的对象。其中一些接口是纯虚拟的。我可能在钻石继承方面存在问题。 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)作为子类的替代方案。 –