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

时间:2018-01-31 19:36:55

标签: c++ oop inheritance multiple-inheritance

我有一个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){
//....
}

构造函数在我的情况下如何看待?

4 个答案:

答案 0 :(得分:8)

  

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

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

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

答案 1 :(得分:7)

帮助继承的一个简单方法是考虑" " vs." 有一个"。

如果您有" "关系,你使用继承。如果您有" "你创建了一个新的数据成员。

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

正如你所说:

  

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

“...每个一个圆圈和两个矩形组成。”解决方案是您自己问题的措辞。正如@ scoohe01所说,一个技巧是在FunnyObject 是一个 Circle和两个Rectangle之间做出选择,或者FunnyObject 一个Circle和两个Rectangle组成。在您的情况下,并按照您选择的措辞,您的设计应符合后一种选择。

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

这也令人困惑。如果您从 Circle Rectangle 继承,您最终会使用getRadius()getSide1()等方法进行混合(因此得名)和getSide2()。它似乎同时具有半径和边,这没有任何意义。

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

希望这有帮助。