c++ - C++ 中的多态问题

标签 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 添加到 vector 中时 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 "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 循环中的基类访问 verts vector 吗?

最佳答案

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

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

还有 getVerticies() (应该是 getVertices() )返回您的 vector 的拷贝,它可能不是预期的。

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

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

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

关于c++ - C++ 中的多态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23277105/

相关文章:

postgresql - 具有多态实体的子类关联表的 SQLAlchemy 设置

c++ - 为什么多态性在这种情况下不起作用?

c++ - 等待超时 - Windows

c++ - 如何在 g++ 中设置警告以警告返回指向局部变量的指针?

python - 简单的python继承

构造函数中的 C++ 虚函数

c++ - 多态失败

c++ - 如何解决错误:SCIP C++中无效的SCIP阶段<10>

重载函数的C++地址

python - 在 Python 中继承 int