2011-08-29 83 views
0

我在我的應用程序編寫GL效果系統,所以我有一個超類叫做的Win32/C++類的繼承問題

cEffect - 它處理加載/解析配置文件爲每個效果

和其他遺傳類新

CFX < > - 爲我添加的每一種效果(模糊,開花,混亂,...)。

的代碼如下簡化,但看起來是這樣的:

Class cEffect 
{ 
    public: 
    bool ParseString(...); 

    private: 
    int m_nStartFrame; 
    int m_nEndFrame; 
    float m_fSpeed; 
}; 


// Blur effect 
Class cFXBlur : public cEffect 
{ 
    public: 
    bool RenderFrame(...); 
}; 
// Bloom effect 
Class cFXBloom : public cEffect 
{ 
    public: 
    bool RenderFrame(...); 
}; 
// Scene drawing effect 
Class cFXScene : public cEffect 
{ 
    public: 
    bool RenderFrame(...); 
}; 
// Clear the depth/color buffer 
Class cFXClearBuffers : public cEffect 
{ 
    public 
    bool RenderFrame(...); 
} 

現在,演示引擎處理具有的效果列表中添加一個

std::vector<cEffect *> m_pvEffects; 

載體。 而且當效果被添加到當前的時間(比方說,我添加一個模糊) 我添加它喜歡:

// Blur to be added 

cEffect *newEffect = new cFXBlur; 
newEffect->SetStartTime(x); 
newEffect->SetEndTime(y); 
newEffect->SetPower(13.0f); 
newEffect->SetTexture(...); 

// Now add the effect to the effects list. 
m_pvEffects.push_back(newEffect); 

現在,當我使我通過m_pvEffects列表迭代 - 而且我想打電話 RenderFrame方法(它是公開的每個CFX < 名稱>效果)。

(*it)->RenderFrame(...) 

但是編譯器說:

錯誤C2039: 'RenderFrame':是不是成員 'CEffect'

我有點明白爲什麼會發生,但真的不能相信的一種方式我該如何解決這個問題, 請問你們能否幫我解決問題 - 好像我失去了這個陰謀......

感謝您的任何建議,我能做些什麼添加CFXcEffect矢量和後 使用 - >RenderFrame方法?

回答

1

您應該將類​​cEffect更改爲:

Class cEffect 
{ 
    public: 
    bool ParseString(...); 
    virtual bool RenderFrame(...) = 0; 

    private: 
    int m_nStartFrame; 
    int m_nEndFrame; 
    float m_fSpeed; 
}; 

您需要的關鍵字virtual,如果要重新定義子類中的方法。該= 0使得類cEffect抽象(即你不能直接類型cEffect的創建對象),所以子類必須實現的方法RenderFrame(...)

+0

謝謝bjoernz/christian - 非常有幫助的答案! – PeeS

1

發生錯誤,因爲cEffect沒有成員函數RenderFrame。你想要的是一個虛擬函數,這是一個面向對象編程的基本概念。基本上你需要添加一個功能

virtual bool RenderFrame(...); 

到你的cEffect的定義。關鍵字virtual基本上告訴編譯器在運行時解決它。這意味着如果您在cEffect指針參考上調用此方法,則調用此指針或參考點的具體派生類的相應方法。在這種情況下,您還應該在所有派生類中聲明該方法爲虛擬方法(儘管這不是必需的,但會使代碼更清晰)。

如果您不希望基類方法做任何事情,並且您希望要求所有派生類用它們自己的實現來覆蓋它,那麼您可以通過使其類似於

virtual bool RenderFrame(...) = 0; 

這基本上告訴編譯器,這是一個抽象方法,它沒有具體的實現,只能由派生類實現。

這是一個非常簡單的解釋(對每個認爲我的措辭不是100%確切的專家的appologies)。您應該閱讀一些關於面向對象編程的更多材料,特別是與C++結合使用。

+0

完美,問題就解決了 - 到底是怎麼做我錯過了.. 感謝基督徒! – PeeS