2014-04-24 118 views
0

我試圖通過它的基類來訪問派生類的數據成員,並且遇到了一些麻煩。C++中的多態性故障

下面是代碼:

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

但是當我嘗試運行此,它說,綠黨的大小爲0的時候,我知道我已經加入VEC 3的載體中。

我有一個名爲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() 
    { 
    } 

有沒有什麼方法可以通過基礎類訪問verts矢量在我的廁所P +

+0

你可以發佈'Cube :: addVert'和'Cube :: getVertices'的實現嗎? –

+0

在這裏發佈_formatted_代碼時請不要使用tab('\ t'')字符!使用體面的IDE或某些文本編輯器將標籤字符重新格式化爲4(或更少)空格,然後將其插入標記形式。我編輯了你的第一部分代碼部分來演示我的意思,請爲其他代碼部分進行說明。 –

+0

是否有代碼實際上將一個vert添加到Actor3D的vert中? –

回答

2

該代碼似乎是正確的,但你不會告訴你如何填充drawablesaddVert的正文。如果你能提供一個我們可以編譯和運行的小例子,那會更好。這個用例不應該很難。

請注意,除非您在派生類中修改它們的行爲,否則不需要將方法定義爲虛擬方法,但這些方法不應該如此。

另外getVerticies()(應該是getVertices())會返回您的向量的副本,它可能不是有意的。

當你寫for (auto actor : drawables)要複製的演員和所有的內容,這可能不是你的意思,我會寫for (auto const &actor : drawables)

你也知道切片?如果你的drawables被聲明爲std::vector<Actor3d>它只包含基類而不是派生的! 現在,如果您創建了一個多維數據集並將其添加到drawables,那麼您的代碼應該可以工作,因爲您的示例沒有使用特定於Cube的任何內容。

同樣,如果您提供一個小的可重複使用的情況下,它會更容易。鏈接到http://ideone.com/sphere-engine這將是完美的:)

+0

+1用於對象切片,'getVerticies()'返回副本。 –