【发布时间】:2019-12-06 17:33:18
【问题描述】:
我正在尝试为我的 Shape 程序实现一个菜单。我已经实现了所有的形状类。两个直接派生自抽象类“Shape”,另外两个派生自一个名为“Polygon”的类,该类派生自“Shape”,如下所示:
Shape -> Polygon -> Rectangle, Triangle
`-> Circle, Arrow
在我的菜单类中,我想创建某种数组,它可以包含指向对象的指针以及基类“Shape”的类型。但我不确定如何正确地做到这一点,并且以一种适用于我所有形状的方式,因为我的 2 个类不是直接从“形状”派生的。
这是我的菜单类:
class Menu
{
protected:
//array of derived objects
public:
Menu();
~Menu();
// more functions..
void addShape(Shape& shape);
void deleteAllShapes();
void deleteShape(Shape& shape);
void printDetails(Shape& shape);
private:
Canvas _canvas; //Ignore, I use this program to eventually draw this objects to a cool GUI
};
在函数“addShape(Shape& shape);”中,我想用它来将每个给定的形状添加到我的数组中。如何实现向其中添加新对象?而且,我如何检查给定的对象是否来自“多边形”?因为如果是这样,那么据我所知,我需要以不同的方式调用成员函数。
【问题讨论】:
-
无论它们是直接还是间接地从
Shape派生,都无关紧要 - 它的工作方式相同。您不必以不同的方式调用成员函数 - 所有形状都应该具有相同的接口(并通过不同地实现接口的virtual方法来做不同的事情)。但是您不必根据类型更改有关如何调用这些成员函数的任何内容-这将违反en.wikipedia.org/wiki/Liskov_substitution_principle -
您应该考虑谁应该拥有这些形状。如果
Menu是所有者,则使用std::unique_ptr<Shape>的数组。如果没有,在Menu中,您应该使用Shape*或std::shared_ptr<Shape>,这取决于您是否确定形状的生命周期会比Menu的生命周期长。 -
std::vector<std::unique_ptr<Shape>>或std::vector<std::shared_ptr<Shape>>应该是您的 goto 存储选择。您选择的将基于您的所有权要求。 -
但是如果我想使用像“printDetails”这样的函数,它假设打印给定形状的详细信息,我不能以相同的方式为所有对象调用打印函数,因为有些其中不直接派生
-
@NathanOliver-ReinstateMonica 两者有什么不同?我的菜单应该一直工作到我将在之后实现的主程序结束
标签: c++ class inheritance polymorphism