c++ - C++ 中的多重继承导致难以覆盖通用功能

标签 c++ inheritance class

在 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/

相关文章:

objective-c - Objective-C中的继承和类别有什么区别

c++ - 在派生类中创建具有相同名称但不同返回类型的新函数

java - 从具有相同名称的子类调用方法 - java

c++ - 结构和类之间的区别?

java - 使用流程构建器来启动类(class)?

c++ - 删除指针失败

c++ - 除了规定的参数和 "this"指针之外,c++ (g++) 构造函数还以什么顺序获取其他参数?

javascript - es6 类方法内的 "This"

c++ - 何时使用 "identity"tmp 技巧?

c++ - 在 C++ 中使用字符串作为数组