【发布时间】:2020-03-02 08:13:51
【问题描述】:
我定义了一个超类。
class Region
{
public:
virtual Region translate(int x,int y);
virtual bool contains(struct point p);
};
现在我有一个定义为 Union 的子类,它基本上采用两个区域的联合。
class Union : public Region
{
Region r1,r2;
Union translate(int x,int y) {
Union translated;
translated.r1 = r1.translate(x,y);
translated.r2 = r2.translate(x,y);
translated.rotateangle=rotateangle;
return translated;
}
};
现在我有专门定义为区域子类的区域,即 Rectangle、Triangle 和 Circle,它们有自己的 translate 函数和相同的返回类型。 (即三角形翻译的返回类型为三角形。)
示例代码:
class Triangle : public Region
{
private:
struct point A,B,C;
public:
Triangle translate(int x,int y)
{
Triangle translated;
translated.A.x+=x;
translated.B.x+=x;
translated.C.x+=x;
translated.A.y+=y;
translated.B.y+=y;
translated.C.y+=y;
return translated;
}
};
正如我们所见,在 Union 类中,我们将两个区域合并在一起,我们不知道它们属于哪个子类(即它们是三角形、圆形还是矩形),但我们仍然想翻译区域 r1 和 r2 在每个区域上调用 translate 函数。
既然我们不能在不知道它们的类型的情况下对 r1 和 r2 调用 translate,我们如何实现这个功能来实现这个层次结构?
【问题讨论】:
-
这是一个闪烁的红旗:
class Union : public Region { Region r1,r2; ...我读为 “Union是一个包含两个Regions 的Region”。 -
请注意,协变(和逆变)仅适用于 C++ 中的指针和引用。
-
translated.rotateangle这是什么意思?没有名为rotateangle的成员 -
为什么你认为你不能在
r1和r2上调用translate?这正是接口(也称为纯虚拟类)的用途。 -
请检查您的示例代码,某些事情是可疑的,细节很重要。首先是已经提到的组合和继承的混合然后
Region::translate返回一个指针,但Triangle::translate返回一个Triangle。
标签: c++ function class oop object