将子类定义为父类以输出子函数

时间:2014-11-26 22:14:56

标签: c++ inheritance multiple-instances

我有一个像这样定义的类:

#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

4 个答案:

答案 0 :(得分:2)

多态性仅适用于非值类型;即带有引用和指针。由于引用必须立即绑定,因此在这里使用起来并不多。

您最好的选择是使用std::unique_ptr<Shape> poly(new Polygon());并使用

致电

poly->getType();

我正在使用std::unique_ptr,因此我无需明确调用deletestd::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溢出让我等了一会儿才接受。感谢