繁体   English   中英

如何从虚函数返回泛型派生类?

[英]How to return a generic derived class from a virtual function?

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

    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函数能够返回从polygon派生的任何类。

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

任何帮助都会很棒。

你指的是一种叫做协变回归类型的概念。

由于函数的返回类型不是其签名的一部分,因此只要是指针引用,就可以在多态方法中返回基类返回类型的派生类型。

在你的情况下,Itriangle的指针(或引用)。

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 {
    ...
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM