【问题标题】:Polymorphism Trouble in C++C++中的多态问题
【发布时间】:2014-04-24 18:37:18
【问题描述】:

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

代码如下:

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 "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 循环中的基类访问顶点向量吗?

【问题讨论】:

  • 你能发布Cube::addVertCube::getVertices的实现吗?
  • 在此处发布格式化代码时请不要使用制表符('\t')!使用一个像样的 IDE 或一些文本编辑器将制表符重新格式化为 4 个(或更少)空格,然后再将其插入标记表单中。我已经编辑了您的第一个代码部分以说明我的意思,请为其他代码部分执行此操作。
  • 是否有代码实际上在 Actor3D 的顶点中添加了顶点?

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


【解决方案1】:

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

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

还有getVerticies()(应该是getVertices())返回你的向量的副本,它可能不是有意的。

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

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

再次,如果您提供一个小的可重现案例,它会更容易。有一个指向http://ideone.com/sphere-engine 的链接就完美了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2020-10-27
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多