我有一个像这样定义的类:
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
class Shape {
protected:
float width, height;
public:
virtual ~Shape(){}
void set_data (float a, float b){
width = a;
height = b;
}
virtual string getType() {
return "Shapes";
}
};
class Polygon: public Shape {
public:
virtual ~Polygon(){};
virtual string getType() {
return "Polygon";
}
};
class Triangle: public Polygon {
public:
virtual ~Triangle(){};
virtual string getType() {
return "Triangle";
}
};
我想获得一个使用这个类的程序
int main () {
Shape poly = Polygon();
Shape tri = Triangle();
std::cout << poly.getType() << std::endl;
std::cout << tri.getType() << std::endl;
return 0;
}
例如,有没有办法让poly.getType()
打印出Polygon
?现在它正在打印Shapes
。我知道如果我做了
Polygon poly = Polygon()
这样做,但我想将poly
存储为Shape
对象,使用Polygon
构造函数构造它,并确保
poly.getType()
返回Polygon
,而不是Shapes
。
答案 0 :(得分:2)
多态性仅适用于非值类型;即带有引用和指针。由于引用必须立即绑定,因此在这里使用起来并不多。
您最好的选择是使用std::unique_ptr<Shape> poly(new Polygon());
并使用
poly->getType();
我正在使用std::unique_ptr
,因此我无需明确调用delete
。 std::shared_ptr
也可以使用,但请查阅文档,以便使用最适合您用例的文档。
顺便说一下,在覆盖子类中的函数时,不需要重复virtual
。您只需要在基类中标记函数virtual
。
答案 1 :(得分:1)
您的代码受object slicing影响。使用:
int main () {
std::unique_ptr<Shape> poly = new Polygon();
std::unique_ptr<Shape> tri = new Triangle();
std::cout << poly->getType() << std::endl;
std::cout << tri->getType() << std::endl;
return 0;
}
答案 2 :(得分:0)
创建一个变量String类型。在每个可实例化的子类中设置它。在Shape中有一个返回它的函数getType。
答案 3 :(得分:0)
上面的回答基本上是正确的:“我需要使用指针”是关键。
这解决了我的问题:
int main ()
{
Polygon poly = Polygon();
Shape* testing = &poly;
std::cout << testing->getType() << std::endl;
return 0;
}
我会在大约一个小时的时间内接受你的回答,因为Stack溢出让我等了一会儿才接受。感谢