我定义了一个父类(super class)。
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,它们具有自己的具有相同返回类型的转换函数。 (即Triangle平移的返回类型为三角形。)
示例代码:
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的类型的情况下对其进行调用,因此如何实现此功能以实现此层次结构?
最佳答案
您需要通过引用或指针将Region
存储在Union
中。按目前的情况,您不能在Triangle
中存储Rectangle
,Union
等等,您将复制(empty?)Region
基础子对象。
就像是
#include <memory>
struct Point
{
int x = 0, y = 0;
};
class Region
{
public:
virtual std::unique_ptr<Region> translate(int x,int y) = 0;
virtual bool contains(Point p) = 0;
};
class Union : public Region
{
std::unique_ptr<Region> r1, r2;
int rotateangle;
public:
std::unique_ptr<Region> translate(int x,int y) override {
auto translated = new Union;
translated->r1 = r1->translate(x,y);
translated->r2 = r2->translate(x,y);
translated->rotateangle = rotateangle;
return std::unique_ptr<Region>(translated);
}
bool contains(Point p) override {
return r1->contains(p) || r2->contains(p);
}
};
class Triangle : public Region
{
Point A,B,C;
public:
std::unique_ptr<Region> translate(int x,int y) override {
auto translated = new Triangle;
translated->A.x = A.x + x;
translated->B.x = B.x + x;
translated->C.x = C.x + x;
translated->A.y = A.y + y;
translated->B.y = B.y + y;
translated->C.y = C.y + y;
return std::unique_ptr<Region>(translated);
}
bool contains(Point p) override {
return false; // TODO
}
};
请注意,您不必知道
Union::translate
返回了Union
(指向)。
关于c++ - 协变返回类型和面向对象的编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60484822/