C++中的多态性问题

Polymorphism Trouble in C++

本文关键字:问题 多态性 C++      更新时间:2023-10-16

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

这是代码:

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

但当我试着运行这个时,它说当我知道我已经在向量中添加了vec3时,verts的大小为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 "engineActor3D.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循环中的基类访问verts向量?

代码看起来是正确的,但您没有向您展示如何填充drawablesaddVert的主体。如果你能提供一个我们可以编译和运行的小例子,那会更好。对于这个用例来说应该不难。

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

此外,getVerticies()(应该是getVertices())返回向量的副本,这可能不是有意的。

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

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

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