在C++中继承同一类两次(故意)

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

本文关键字:一类 故意 两次 C++ 继承      更新时间:2023-10-16

我有一个Circle类和一个Rectangle类。 我现在想做一个类FunnyObject,每个类由一个圆形和两个矩形组成。

如果我这样做:

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

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

此外,通常构造函数是:

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

在我的情况下,构造函数的外观如何?

帮助继承的一个简单技巧是考虑">isa"与">has a"。

如果你有一个">"关系,你就使用继承。如果您具有">具有"关系,则可以创建新的数据成员。

FunnyObject矩形还是圆形?如果是这样,请继承。

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

我有一个圆形类和一个矩形类。我现在想创建一个类 FunnyObject,每个类由一个圆形和两个矩形组成。

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

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

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

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

正如你所说:

我有一个圆形类和一个矩形类。我现在想做一个 类FunnyObject,每个由一个圆形和两个矩形组成。

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

另一个技巧是你不能继承多次。在您的示例中,您希望从矩形继承两次。假设有一个getSide1()方法。你会怎么称呼它?getSide1'1()getSide1'2()...只是没有办法。

这也令人困惑。如果你从圆形矩形继承,你最终会得到一个混合(因此它的名字)与getRadius()getSide1()getSide2()等方法。它似乎既有半径又有边,这毫无意义。

最后,还有子类化规则或利斯科夫替换原则。 继承类(FunnyObject?)可以在使用圆形或矩形的所有情况下使用吗?一点也不。好吧,至少以一种有意义的方式。

希望这有帮助。