2011-07-28 76 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

请显示使用声明的代码。 –