在 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()... 就是没有办法。

这也令人困惑。如果你从 CircleRectangle 继承,你最终会得到一个混合的方法(因此它的名字)像 getRadius()getSide1()getSide2() .它似乎有半径和边,这是没有意义的。

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

希望这会有所帮助。

【讨论】:

以上是关于在 C++ 中继承同一个类两次(故意)的主要内容,如果未能解决你的问题,请参考以下文章

C++和Java中继承的个人感觉

C++中继承与多态

C#中继承问题

如何在 JavaScript 中继承 C++ 类?

C++中继承类的构造函数

为啥在 Qt 中继承 QWidget 类时出现内存泄漏