在 C++ 中继承同一个类两次(故意)
Posted
技术标签:
【中文标题】在 C++ 中继承同一个类两次(故意)【英文标题】:Inherit same class twice in C++ (on purpose) 【发布时间】:2018-01-31 19:36:55 【问题描述】:我有一个 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)
//....
构造函数在我的例子中会是什么样子?
【问题讨论】:
听起来您应该改用数据成员。 这是不允许的:godbolt.org/g/EFcteo 继承是错误的方式。见artima.com/designtechniques/compoinh.html 为什么投反对票? 【参考方案1】:帮助继承的一个简单技巧是考虑“是一个”与“有一个”。
如果你有一个“是一个”的关系,你使用继承。如果你有一个“有一个”的关系,你就创建一个新的数据成员。
FunnyObject 是矩形还是圆形?如果是,继承。
FunnyObject 有两个矩形和圆形吗?如果是这样,请制作成员变量。
【讨论】:
【参考方案2】:我有一个 Circle 类和一个 Rectangle 类。我现在想做一个FunnyObject 类,每个类由一个圆和两个矩形组成。
使用对象组合而不是继承。
class FunnyObject
Circle circle;
Rectangle rectangle1;
Rectangle rectangle2;
【讨论】:
【参考方案3】:在这种情况下你不需要继承,使用组合:
class FunnyObject
Circle myCircle;
Rectangle myRectangle1;
Rectangle myRectangle2;
【讨论】:
【参考方案4】:如你所说:
我有一个 Circle 类和一个 Rectangle 类。我现在想做一个 类FunnyObject,每个由一个圆形和两个矩形组成。
“...每个由一个圆形和两个矩形组成。”解决方案是您自己问题的措辞。正如@scoohe01 所说,一个技巧是在FunnyObject 是一个圆和两个矩形之间进行选择,或者FunnyObject 由一个圆和两个矩形组成。在您的情况下,按照您选择的措辞,您的设计应该与后一种选择相对应。
另一个技巧是您不能多次继承。在您的示例中,您希望从 Rectangle 继承两次。假设有一个getSide1()
方法。你会如何提及它? getSide1'1()
和 getSide1'2()
... 就是没有办法。
这也令人困惑。如果你从 Circle 和 Rectangle 继承,你最终会得到一个混合的方法(因此它的名字)像 getRadius()
、getSide1()
和 getSide2()
.它似乎有半径和边,这是没有意义的。
最后,还有子类化规则或 Liskov 的替换原则。 继承类 (FunnyObject?) 可以在所有使用 Circle 或 Rectangle 的情况下使用吗?一点也不。好吧,至少以一种有意义的方式。
希望这会有所帮助。
【讨论】:
以上是关于在 C++ 中继承同一个类两次(故意)的主要内容,如果未能解决你的问题,请参考以下文章