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

标签 c++ function class oop object

我定义了一个父类(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/

相关文章:

javascript - 有没有办法让一组类方法知道调用何时终止?

c++ - 按私有(private)成员对自定义对象进行排序

Swift:指向结构体与类的指针

matlab - 将函数作为参数传递给函数

python - 如何在数据框的每一行上应用一个函数?

ios - SwiftUI 观察到对象在其属性更改时执行操作

c++ - 如何从构造函数中确定类的内存分配地址?

c++ - 像素颜色计算 255 到 0

c++ - select 函数中挂起的 fd 异常条件是什么?

c++ - 生成自动变灰的makefile - eclipse