我正在编写一个创建和操作形状的程序。我遇到问题的代码部分如下,特别是多边形类中虚函数的返回类型。 (这已经减少了紧凑性)
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函数能够返回派生自多边形的任何类。
我试过使用点和模板,但我不确定两者。
任何帮助都会很棒。
答案 0 :(得分:3)
由于函数的返回类型不是其签名的一部分,因此只要是指针,就可以在多态方法中返回基类返回类型的派生类型。 参考。
在你的情况下,指向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 {
...
};