关于c ++继承的一个非常简单的问题。
让我说我有几节课。
A类继承自B类和C类。
我想让D类继承自A类,但C类的功能正在破坏我的代码。
当我继承D类中的A类时,是否有可能以某种方式排除C类?
编辑:
@Quentin
我正在使用SFML,而A类继承自sf :: NonCopyable类。 A类是SceneNode类,游戏世界中所有实体/对象的层次结构都基于该类。我正在创建一个“TileEngine”类来生成“TileLayer”对象的实例,我希望TileLayers继承SceneNode,这样我就可以通过层次结构将绘图调用传递给它们,但由于它们是不可复制的,我无法适应它们进入容器并在TileEngine类中迭代它们。
但我认为你是对的,它并没有真正打破代码。我想我只需要添加一些变量并提出一个簿记系统来使其工作。
如果我问的是可能的,我只是很好奇,因为它是一个简单的解决方案而且我不知道使用继承的所有细节,所以即使我似乎不太可能决定检查。对于回复而言,我认为我将能够自己调整代码。
答案 0 :(得分:3)
不。
A
1>} B
和C
。
如果D
不能是C
,那么它也不能是A
。
也许用构图代替?
根据您的具体情况进行更新:有几种方法可以解决这个问题。
首先,SceneNode
确实需要不可复制,如果是,为什么?如果这是一个纯粹的设计决定,现在很明显它是错误的,因为你现在需要一个可复制的SceneNode
。如果决策是技术性的(例如,存在难以正确克隆的簿记数据),您可以尝试解决该问题。失败了......
你的SceneNode
可以改变吗?移动语义通常比复制语义更容易实现,标准容器完全满足于仅移动值。但即使在那种情况下......
您的SceneNode
可能是一个简单的界面吗?你只提到能够调用绘图功能。这听起来与任何复制业务无关,因此您可能只需要具有纯虚拟draw
功能的接口。否则...
如果你真的无法满足这些要求(此时我会感到惊讶,但让我们假装),你可以简单地使用std::unique_ptr<TileLayer>
的容器。这些不需要任何东西,可以随意存储在容器中。
然后还有一整套'其他技术可以适合你的情况。不要忘记,OOP和继承只是解决这个问题的一种方法,但C ++除此之外还提供了更多的工具和技术。但首先,让它工作:)