在 C++ 物理模拟中,我有一个名为 Circle 和 Square 的类。这些是形状,并有一个名为 push() 的方法,该方法对其施加力。然后有一个 Circle 的特例,称之为 SpecialCircle,其中 push() 应该表现出稍微不同的属性。但实际上,还有 SpecialSquare() 应该表现出相同的力属性。所以我想要一个名为 Shape 的抽象基类来处理圆和正方形,但我也想要一个名为 Special 的抽象基类,它将特殊属性应用于 force()。
设计此类结构的最佳方式是什么?
到目前为止,我有:
class Shape {
virtual void push();
};
class Circle : public Shape {};
class Square : public Shape {};
class Special {
virtual void push();
};
class SpecialCircle : public Circle, Special {};
class SpecialSquare : public Square, Special {};
当然,上面不会编译,因为 Special::push() 和 Shape::push() 冲突。正如预期的那样,我收到“错误:对成员‘推送’的请求不明确”。
如何重新组织我的类结构,使 Circle 和 Square 可以彼此共享某些属性,但 SpecialCircle 和 SpecialSquare 仍然可以继承自 Shape,并且还继承自 Special 的修改功能?
谢谢。
ps.,这是菱形继承(钻石问题)问题吗?
最佳答案
另一种解决方案(它可能适合也可能不适合您的需求,这取决于您的实现细节):
- 拥有类Behavior,让NormalBehavior和SpecialBehavior继承自它。
- 拥有Shape 类,并让Square 和Circle 继承它。让 Shape 成为聚合类型,具有 Behavior 成员(即,您将 Behavior 对象传递给各种 Shape 构造函数)。换句话说,让一个 Shape 有一个 Behavior。
- 将形状行为的实际差异委托(delegate)给行为层次结构的方法。
相反,您可以:
- 拥有类PhysicalObject,让NormalObject和SpecialObject继承自它;
- 拥有类Shape,并让Square和Circle继承自它;
- 让 PhysicalObject 具有形状。
更喜欢聚合而不是继承。这是 Bridge pattern 的应用程序.这个策略相对于 Square、SpecialSquare、Circle 和 SpecialCircle 的优势在于,明天您将不得不添加 Rectangle、Hexagon 等等,并且对于您添加的每个形状,您都必须实现两个 类(重复的代码是邪恶的);在我看来,这是 Bridge 解决的真正问题。
关于c++ - C++ 中的多重继承导致难以覆盖通用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/432143/