gpt4 book ai didi

c++ - 协变返回类型和面向对象的编程

转载 作者:行者123 更新时间:2023-12-02 10:05:18 25 4
gpt4 key购买 nike

我定义了一个父类(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中存储RectangleUnion等等,您将复制(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com