gpt4 book ai didi

c++ - C++中接口(interface)类和实现类的并行继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:04 26 4
gpt4 key购买 nike

我正在尝试以类似于 Java 接口(interface)的方式使用 C++ 抽象基类。假设我们有以下只有纯虚函数的接口(interface)类:

class Shape { virtual double area()=0; };
class Square : public Shape { virtual void setLength(double length)=0; };
class Rectangle : public Square { virtual void setWidth(double width)=0; };

我尝试通过以下方式实现 Square 和 Rectangle:

class SquareImpl : public Square { /*implementation*/ };
class RectangleImpl : public SquareImpl, Rectangle { /*implementation*/ };

其中 RectangleImpl 继承了 SquareImplRectangle 以重用,比如 SquareImpl::area()。然而,当我尝试编译时,出现了两个问题:首先,SquareImpl 中的所有方法都没有正确继承,我必须手动重新实现 RectangleImpl::area()RectangleImpl::setLength()。其次,这还引入了菱形问题,即ShapeRectangleImpl的歧义基。

如果我从 Shape 虚拟继承 Square,我可以编译代码,但我认为性能不会随着添加更多派生接口(interface)而扩展。同样奇怪的是,RectangleImpl 仍然没有继承 SquareImpl::setLength(),尽管 SquareImpl::area() 继承得很好。 (忽略这里的实用性)

另一种解决方案可能是使接口(interface)彼此独立,即使 Square 不继承自 Shape。但是,如果我定义采用 Square* 指针的函数,这样做会使我无法访问 Shape 中的方法。它还将使 ShapeSquare 之间无法进行 static_cast。

那么我的问题是,C++中有没有其他设计模式可以解决这种接口(interface)类和实现类之间的并行继承,而不需要虚继承?

(编辑说明:上面的示例代码只是我对接口(interface)和实现之间的并行继承的虚拟说明。我知道有更好的方法来实现形状,但我的问题不在于如何实现形状。)

最佳答案

这里的情况是 Diamond Problem ,这可能发生在任何允许多重继承的 OO 语言中。顺便说一下,这就是 Java 设计者决定不使用多重继承并提出接口(interface)概念的原因之一。

C++处理菱形问题的方式是Virtual Inheritance .

而且,正如 codymanix 指出的那样,正方形和矩形是面向对象设计的一个臭名昭著的坏例子,因为就 OO 而言 a square is not a rectangle .

再加点。首先,您在这里所做的事情的术语是多重继承,而不是“并行继承”。其次,在这种特殊情况下,拥有一个 class Square 和一个 class SquareImpl 确实没有什么意义。如果您认为您可能有不同的 Square 实现,您应该只有一个基类,它提供默认实现和虚函数,必要时可以由派生类覆盖这些虚函数。换句话说,您应该将 SquareSquareImpl 合并到一个具有虚函数的类中。

您当然可以像使用 Java 接口(interface)一样使用抽象 C++ 类,但大多数时候没有理由这样做。接口(interface)被添加到 Java 中正是作为一种解决多重继承不足的方法。在 C++ 中,您可以继续使用多重继承,尽管您应该始终非常明智地这样做。

关于c++ - C++中接口(interface)类和实现类的并行继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com