如何从虚函数 return 派生 class 泛型?
How to return a generic derived class from a virtual function?
我正在编写一个创建和操作形状的程序。下面是我遇到问题的代码部分,特别是多边形 class 中虚函数转换的 return 类型。 (这已经减少了紧凑性)
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 ;
}
然后我继续从多边形中导出其他几个形状 class。
我遇到的问题是我希望翻译功能能够return任何从多边形派生的class。
我试过使用积分和模板,但我对两者都不确定。
任何帮助都会很棒。
您指的是一个名为 covariant return type.
的概念
由于函数的 return 类型不是其签名的一部分,因此您可以 return 多态方法中基础 return 类型的派生类型,只要它指针或引用.
在您的例子中,指向 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(...);
}
};
请注意,如果您想 return 它返回,则不能在 translate
方法的堆栈上创建它。意思是,您必须使用 new
.
分配它
一般来说,参考也可以实现这一点,但在您的情况下,由于 ITriange
是在 translate(...)
方法内部创建的,因此会有问题(无论它是在堆栈上创建还是在该引用将指向未分配的内存,或者它是在堆上分配的并且没有人知道它需要被删除,因为它是一个引用)。
例如,如果您 return 是 class 的成员,那么您将能够使用引用。
我创建了一个虚拟应用程序供您查看它的运行情况:
#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);
}
这会打印:
polygon!
triangle!
triangle!
顺便说一下,我注意到您的代码中有一个 错误。
你的Itriangle
定义为:
class Itriangle : public matrix, polygon {
...
};
这意味着您正在私下继承多边形。这很少是您想要做的。
我猜你是:
class Itriangle : public matrix, public polygon {
...
};
我正在编写一个创建和操作形状的程序。下面是我遇到问题的代码部分,特别是多边形 class 中虚函数转换的 return 类型。 (这已经减少了紧凑性)
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 ;
}
然后我继续从多边形中导出其他几个形状 class。
我遇到的问题是我希望翻译功能能够return任何从多边形派生的class。
我试过使用积分和模板,但我对两者都不确定。
任何帮助都会很棒。
您指的是一个名为 covariant return type.
的概念由于函数的 return 类型不是其签名的一部分,因此您可以 return 多态方法中基础 return 类型的派生类型,只要它指针或引用.
在您的例子中,指向 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(...);
}
};
请注意,如果您想 return 它返回,则不能在 translate
方法的堆栈上创建它。意思是,您必须使用 new
.
一般来说,参考也可以实现这一点,但在您的情况下,由于 ITriange
是在 translate(...)
方法内部创建的,因此会有问题(无论它是在堆栈上创建还是在该引用将指向未分配的内存,或者它是在堆上分配的并且没有人知道它需要被删除,因为它是一个引用)。
例如,如果您 return 是 class 的成员,那么您将能够使用引用。
我创建了一个虚拟应用程序供您查看它的运行情况:
#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);
}
这会打印:
polygon!
triangle!
triangle!
顺便说一下,我注意到您的代码中有一个 错误。
你的Itriangle
定义为:
class Itriangle : public matrix, polygon {
...
};
这意味着您正在私下继承多边形。这很少是您想要做的。
我猜你是:
class Itriangle : public matrix, public polygon {
...
};