2014-02-14 125 views
1

我已經閱讀了很多關於虛擬功能的內容,但是我仍然無法獲得某些功能來滿足我的需求。Overriden虛擬功能

基本上,我有下面的類:

class Body 
{ 

    protected: 
     scene::ISceneNode* Model; 
     virtual void setModel(); 
    public: 
     Body(core::vector3df Position, core::vector3df Rotation); 
}; 


Body::Body(core::vector3df Position, core::vector3df Rotation) 
{ 
    CurrentThrust = 0; 
    setModel(); 
    Model->setPosition(Position); 
    Model->setRotation(Rotation); 
} 

void Body::setModel() 
{ 
    Model = Engine::Instance->GetSceneManager()->addCubeSceneNode(); 
    Model->setMaterialFlag(video::EMF_LIGHTING, false); 
} 

我創建新類繼承車身,這種想法是,我重寫「則setModel()」中的類和構造函數將加載我的新模型,而不是默認的;像下面

class Craft : public Body 
{ 
    protected: 
     virtual void setModel(); 
    public: 
     Craft(core::vector3df Position, core::vector3df Rotation); 
}; 

Craft::Craft(core::vector3df Position, core::vector3df Rotation) : Body(Position, Rotation) 
{ 
    // Other stuff 
} 

void Craft::setModel() 
{ 
    Model = Engine::Instance->GetSceneManager()->addAnimatedMeshSceneNode(Engine::Instance->GetSceneManager()->getMesh("resource/X-17 Viper flying.obj")); // addCubeSceneNode(); 
    Model->setMaterialFlag(video::EMF_LIGHTING, false); 
    Model->setScale(core::vector3df(0.1f)); 
} 

然而,它始終會創建一個立方體的模型,而不是我的蝰蛇模式,當我創建工藝的新實例。

是否有可能讓虛擬功能像我在想的那樣工作?或者我是否需要更改我的構造函數以在各自的類中創建模型?

感謝

+1

你應該避免在構造函數中調用虛函數http://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors – mathematician1975

+0

你如何創建對象?請向我們展示使用情況,這是這種情況下非常重要的部分。 –

回答

3

是否有可能得到虛函數的工作就像我在想什麼?

號當你調用一個從構造函數,它根據正在初始化類(Body在這種情況下),而不是最終的置換器(因爲尚未初始化布控,所以不能安全訪問)。

還是我需要改變我的構造函數以在各自的類中創建模型?

這可能是最簡單的解決方案。我建議將模型作爲構造函數參數傳遞給Body。這樣,就不可能忘記設置它。

0

像mathematician1975指出,你應該從來沒有在構造函數或析構函數內使用虛擬方法。

通過構造函數構建的對象不能被視爲構造函數的類直到控制流離開構造函數。每當你在Craft的構造函數中調用一個虛擬方法時,你總是會調用一個Body的方法。由於設置模型意味着從文件中加載網格,這通常是一項相當昂貴的操作,所以我建議您在真正需要它之前不要這樣做,也就是說,無論何時請求模型。在這一點上,你的虛擬應該像你期望的那樣行事。

1
class Craft : public Body 
{ 
    protected: 
     void setModel(); 
    public: 
     Craft(core::vector3df Position, core::vector3df Rotation); 
}; 

請勿在Class Craft中使用關鍵字virtual

+1

'虛擬'是有效的。如果支持,「覆蓋」會更好。無論如何,這與OP問題無關。 – Jarod42