2011-02-07 69 views
2

我在做它使用OpenGL和當前存儲需要渲染每一幀這是這個樣子對象的數組應用:是否可以將派生類的數組截斷爲C++中的基類數組?

class Object { 
    private: 
    float x; 
    float y; 
    public: 
    void func1(); 
    void func2(); 
    ... 
}; 

我希望能夠創建一個頂點緩衝區對象從這些對象的數組中,但我不能簡單地傳遞數組,因爲類包含glBufferData不期望的附加函數。

是否有可能給對象類分離像這樣:

class baseObject { 
    public: 
    float x; 
    float y; 
}; 

class derivedObject : public baseObject { 
    public: 
    float x; 
    float y; 
    void func1(); 
    void func2(); 
    ... 
}; 

,然後澆鑄的derivedObjects陣列成使用static_cast或以其它方式,然後可以被傳遞到一個glBufferDatabaseObjects數組?或者是迭代對象數組的唯一方法,將xy變量提取到單獨的數組中,然後可以將其傳遞給glBufferData

+2

你是說基礎派生類和派生類都有單獨的float x&y嗎? – 2011-02-07 20:44:08

+0

爲什麼你不能通過陣列?這些功能不與數據成員一起存儲。 – genpfault 2011-02-07 20:45:17

回答

2

Object類中的函數實際上不會對對象的佈局做任何貢獻。儘管規範不能保證這一點,但在所有主要編譯器中,對象的內存中表示只是其字段。 (但是,如果您將虛擬功能添加到組合中,則不是這樣)。在你的情況,你的Object類看起來沒有區別從這個struct內存:

struct JustObjectFields { 
    float x, y; 
}; 

因爲當你刪除的成員函數,這是你留下什麼用。

其原因是成員函數通常會編譯爲將this指針作爲顯式第一個參數的常規函數​​。這段代碼與類的任何一個實例都是分開的,所以類的大小不受它們的影響。總之,你應該能夠做到這一點,根本不使用繼承。只需使用您的原始Object類。

0

您可以創建一個基類指針數組,並手動將它們指向派生類數組中的元素。然而,你不能對數組本身進行任何幻想,因爲數組偏移取決於知道每個元素的實際大小。使用指針,這不是問題,但是對於數組中的實際實例,當嘗試使用錯誤類型的指針訪問各個元素時,會遇到大量崩潰。

0

類型轉換爲陣列不會在這種情況下工作 - http://codepad.org/6DFLPPDH
一般來說,其不可能變換派生的對象的陣列到陣列 基礎對象的不移動的數據,我想沒有人打擾 特別支持派生類僅添加方法的情況。
事實上,即使數組指針投並不十分可靠 - http://codepad.org/15a4cCy9
但與普通的指針它肯定不是一個問題 - http://codepad.org/4vEK5wY1
而在你的情況下,它應該沒問題,無論如何,我猜。

0

簡答:是的。如果glBufferData接受baseObject作爲參數,則也可以使用derivedObject,因爲類derivedObject的實例也是類baseObject的實例。

這裏的問題不是方法/函數,而是數據。 glBufferData需要類baseObject的一個實例作爲參數,因爲該方法需要一個包含baseObject中描述的數據成員的對象。 Object作爲參數無效,因爲其數據成員可能與baseObject不同。如果該方法傳遞了具有無效數據的對象,這可能證明是災難性的。

然而,通過定義derivedObjectbaseObject繼承,我們是在說derivedObjectIS一個baseObject所有數據derivedObject的定義中列出的成員。因此,當我們將derivedObject的實例傳遞給glBufferData時,它可以將其視爲baseObject的實例而沒有危險。

相關問題