在 C++ 中继承相同的 class 两次(故意)

Inherit same class twice in C++ (on purpose)

我有一个 Circle class 和一个 Rectangle class。 我现在想做一个classFunnyObject,每个由一个圆和两个长方形组成。

如果我这样做:

class FunnyObject:public Circle, public Rectangle, public Rectangle{
//How do I refer to each of the Rectangle classes?

}

由于存在歧义,如何在两个 Rectangle classes 中引用函数和变量?

还有,一般构造函数是:

FunnyObject::FunnyObject:Circle(arguments), Rectangle(arguments){
//....
}

在我的案例中,构造函数看起来如何?

I have a Circle class and a Rectangle class. I now want to make a class FunnyObject, each made of one circle and two rectangles.

使用对象组合而不是继承。

class FunnyObject
{
    Circle circle;
    Rectangle rectangle1;
    Rectangle rectangle2;
}

帮助继承的一个简单技巧是考虑“是一个”与“有一个”。

如果你有一个“是一个”的关系,你使用继承。如果你有一个“有一个”关系,你创建一个新的数据成员。

FunnyObject 是一个矩形还是一个圆?如果是,继承。

FunnyObject 两个矩形和圆形吗?如果是,则创建成员变量。

在这种情况下你不需要继承,使用组合:

class FunnyObject
{
    Circle myCircle;
    Rectangle myRectangle1;
    Rectangle myRectangle2;
}

如你所说:

I have a Circle class and a Rectangle class. I now want to make a class FunnyObject, each made of one circle and two rectangles.

“...每个 一个圆和两个矩形组成。”解决方案就在你自己问题的措辞中。正如@scoohe01 所说,一个技巧是在 FunnyObject 是一个 圆和两个矩形之间进行选择,或者 FunnyObject 是由 一个圆和两个矩形组成。在你的情况下,按照你选择的措辞,你的设计应该与后一种选择相对应。

另一个技巧是你不能继承超过一次。在您的示例中,您希望从 Rectangle 继承两次。假设有一个 getSide1() 方法。你会如何称呼它? getSide1'1()getSide1'2()... 没有办法。

也是一头雾水。如果您从 CircleRectangle 继承,您将最终得到混合方法(因此得名),如 getRadius() , getSide1()getSide2()。它似乎既有半径又有边,这没有意义。

最后,还有 subclassing 规则或 Liskov 替换原则。 继承class (FunnyObject?) 是否可以在所有使用Circle 或Rectangle 的情况下使用?一点也不。好吧,至少以一种有意义的方式。

希望对您有所帮助。