我正在编写一个创建和操作形状的程序。我遇到问题的代码部分如下,特别是多边形类中虚函数转换的返回类型。 (为了紧凑,这已经减少了)

    class polygon{
    public:
    virtual ~polygon(){};
    virtual class polygon translate() {};
    };

    class Itriangle : public matrix, polygon{
   private:
      vector <matrix> vertices;  // vector of matrices
      double centrex;
      double centrey;
      double sides;
   public:
   //Constructors (default/p const(points)/p const(centre and lengths))
   Itriangle(){};

   //Destructor
   ~Itriangle(){};

   //Functions from interface

   Itriangle translate(class matrix &m){
      . . .
   Itriangle translated (transCx, transCy, a, b, c);
       return translated ;
   }

然后我继续从多边形类中导出其他几个形状。

我遇到的问题是我希望 translate 函数能够返回从多边形派生的任何类。

我尝试使用点和模板,但我不确定两者。

任何帮助都会很棒。

最佳答案

您指的是一个称为 covariant return type 的概念。
由于函数的返回类型不是其签名的一部分,因此您可以在多态方法中返回基返回类型的派生类型,只要它是 指针 引用
在您的情况下,指向 Ittriangle 的指针(或引用)。

class polygon {
public:
    polygon *translate(class matrix &m) {
       return new polygon(...);
    }
};

class Itriangle : public matrix, polygon {
public:
    Itriangle *translate(class matrix &m) {
       return new Itriangle(...);
    }
};
请注意,如果要返回它,则无法在 translate 方法的堆栈上创建它。意思是,您必须使用 new 分配它。
一般来说,也可以使用引用来实现这一点,但在您的情况下,由于 ITriange 是在 translate(...) 方法内部创建的,这将是有问题的(无论它是在堆栈上创建并且引用指向未分配的内存,还是分配在堆,没有人知道它需要删除,因为它是一个引用)。
例如,如果您要返回类的成员,那么您将能够使用引用。

我已经创建了一个虚拟应用程序供您查看它的运行情况:
#include <iostream>

using namespace std;

class polygon {
public:
    virtual polygon *translate(int x) {
        cout << "polygon!" << endl;
       return new polygon();
    }
};

class Itriangle : public polygon {
public:
    Itriangle *translate(int x) {
        cout << "triangle!" << endl;
       return new Itriangle();
    }
};

int main() {
    polygon p;
    Itriangle t;
    polygon &pt = t;

    p.translate(1);
    t.translate(2);
    pt.translate(3);
}
这打印:


顺便说一下,我注意到你的代码中有一个 错误
您的 Itriangle 已定义:
class Itriangle : public matrix, polygon {
    ...
};
这意味着您私下继承了多边形。这很少是你想做的。
我猜你会说:
class Itriangle : public matrix, public polygon {
    ...
};

关于c++ - 如何从虚函数返回泛型派生类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29652953/

10-17 02:10