C ++多类问题

时间:2018-01-15 13:23:35

标签: c++ inheritance

关于c ++继承的一个非常简单的问题。

让我说我有几节课。

A类继承自B类和C类。

我想让D类继承自A类,但C类的功能正在破坏我的代码。

当我继承D类中的A类时,是否有可能以某种方式排除C类?

编辑:

@Quentin

我正在使用SFML,而A类继承自sf :: NonCopyable类。 A类是SceneNode类,游戏世界中所有实体/对象的层次结构都基于该类。我正在创建一个“TileEngine”类来生成“TileLayer”对象的实例,我希望TileLayers继承SceneNode,这样我就可以通过层次结构将绘图调用传递给它们,但由于它们是不可复制的,我无法适应它们进入容器并在TileEngine类中迭代它们。

但我认为你是对的,它并没有真正打破代码。我想我只需要添加一些变量并提出一个簿记系统来使其工作。

如果我问的是可能的,我只是很好奇,因为它是一个简单的解决方案而且我不知道使用继承的所有细节,所以即使我似乎不太可能决定检查。对于回复而言,我认为我将能够自己调整代码。

1 个答案:

答案 0 :(得分:3)

不。

A } BC。 如果D不能是C,那么它也不能是A
也许用构图代替?

根据您的具体情况进行更新:有几种方法可以解决这个问题。

首先,SceneNode确实需要不可复制,如果是,为什么?如果这是一个纯粹的设计决定,现在很明显它是错误的,因为你现在需要一个可复制的SceneNode。如果决策是技术性的(例如,存在难以正确克隆的簿记数据),您可以尝试解决该问题。失败了......

你的SceneNode可以改变吗?移动语义通常比复制语义更容易实现,标准容器完全满足于仅移动值。但即使在那种情况下......

您的SceneNode可能是一个简单的界面吗?你只提到能够调用绘图功能。这听起来与任何复制业务无关,因此您可能只需要具有纯虚拟draw功能的接口。否则...

如果你真的无法满足这些要求(此时我会感到惊讶,但让我们假装),你可以简单地使用std::unique_ptr<TileLayer>的容器。这些不需要任何东西,可以随意存储在容器中。

然后还有一整套'其他技术可以适合你的情况。不要忘记,OOP和继承只是解决这个问题的一种方法,但C ++除此之外还提供了更多的工具和技术。但首先,让它工作:)