0

我正在尝试决定是否对我的问题使用多态性。下面是一个类似于我为这个问题而创建的问题的虚拟问题:

假设我有一个派生类 Rectangle、Triangle 和 Circle 的基类 Shape。它们都实现了一个 Area() 函数。我有 n 个形状向量;vector<Shape*> v_1, v_2, v_3, ..., v_n. 我想要的输出是,只有当它是一个矩形时,它才会vector<Rectangle*> maxrec在每个中存储最大区域的形状。v_1, v_2, ..., v_n(例如,如果最大面积Shapev_i是一个Rectangle,我把它加到maxrec。如果不是,我不加。)

由于输入是vector<Shape*>,在将元素添加到之前将Shape*元素转换为元素是否可以接受?还是我在这里遗漏了设计缺陷?多态性合适吗?(我对算法部分没有问题,只是多态设计部分。)Rectangle*maxrec

4

2 回答 2

0

您必须考虑的是“形状”实际上将共享任何功能或字段。例如,它们都将具有面积(即使以不同的方式计算),但是我认为这不一定足以证明父类的合理性。我认为了解这些形状的作用对于证明是否使用多态性是很重要的。

于 2013-05-06T18:59:11.603 回答
0

将任何 Shape* 转换为 Rectangle* 是不可接受的。您将需要使用dynamic_cast运算符。例如:

Shape *shape=...;
Rectangle *rec=dynamic_cast<Rectangle*>(shape); 

如果 shape 确实是一个 Rectangle,那么您将在 rec 中拥有一个指向 Rectangle 的有效指针,否则 rec 将为 NULL。

于 2013-05-06T19:00:05.387 回答