C ++中的多态性问题

时间:2014-04-24 18:37:18

标签: c++ inheritance polymorphism virtual function-calls

我试图通过其基类访问派生类的数据成员,但我遇到了一些麻烦。

以下是代码:

for (auto actor : drawables) {
    if (actor.isDrawable()) {
        std::vector<glm::vec3> verts = actor.getVerticies();
        for (glm::vec3 v : verts) {
            // do stuff
        }
    }
}

但是当我尝试运行它时,它表示当我知道我已经将vec3添加到向量中时,顶点的大小为0。

我有一个名为Actor3D的基类,它具有以下属性:

    class Actor3D
    {
    private:
    static int actorCount;

    protected:
    int id;
    bool _isDrawable;

    glm::vec3 position;
    glm::vec3 rotation;

    std::vector<glm::vec3> verts;
    //std::vector<glm::vec3> color;
    std::vector<glm::vec3> normals;

    virtual void addVert(float x, float y, float z);

    public:
    virtual std::vector<glm::vec3> getVerticies() const { return verts; }
    ...
    }

然后我有一个派生类,其定义如下:

    #include "engine\Actor3D.h"

    class Cube : public Actor3D
    {
    public:
    Cube();
    ~Cube();
    };

在cpp文件中:

    Cube::Cube()
    {
    _isDrawable = true;

    position.x = 5;
    position.y = 5;
    position.z = 7;

    addVert(-1.0, 0.0, -1.0);
    addVert(-1.0, 0.0, 1.0);
    addVert(1.0, 0.0, 1.0);
    addVert(1.0, 0.0, -1.0);
    }

    Cube::~Cube()
    {
    }

我是否可以通过for循环中的基类访问顶点向量?

1 个答案:

答案 0 :(得分:2)

代码似乎是正确的,但您没有告诉您如何填充drawablesaddVert的正文。如果你能提供一个我们可以编译和运行的小例子,那会更好。这个用例应该不难。

请注意,您不需要将方法定义为虚拟方法,除非您在派生类中修改它们的行为,但不应该是这些方法的情况。

同样getVerticies()(应为getVertices())会返回您的矢量副本,但可能无意。

当你写for (auto actor : drawables)时,你正在复制演员及其所有内容,这可能不是你的意思,我会写for (auto const &actor : drawables)

你也知道切片吗?如果您的drawables被声明为std::vector<Actor3d>,它只包含Base类而不是派生类! 现在,如果您创建一个多维数据集并将其添加到drawables,您的代码应该可以正常工作,因为您的示例不使用Cube特有的任何内容。

如果你提供一个小的可重复的案例,它会更容易。通过指向http://ideone.com/sphere-engine的链接,这将是完美的:)