2014-02-14 2 views
1

가상 함수에 대해 많은 내용을 읽었지만 여전히 원하는 방식으로 작업 할 수는 없습니다.가상 함수 재정의

기본적으로, 나는 다음 클래스있어 :

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"을 무시하고, 생성자로드 것입니다 내 새 모델, 기본 대신; like

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)); 
} 

그러나 Craft의 새 인스턴스를 만들 때 항상 My Viper 모드 대신 Cube 모델을 만듭니다.

내가 생각하는 것처럼 작동하도록 가상 기능을 사용할 수 있습니까? 또는 각각의 클래스에서 모델을 만들기 위해 생성자를 변경해야합니까?

감사

+1

생성자에서 가상 함수를 호출하면 안됩니다. http://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors – mathematician1975

+0

개체를 만드는 방법은 무엇입니까? 사용법을 보여주십시오.이 경우 매우 중요합니다. –

답변

3

그것은 내가 생각하고 있어요처럼 작동하는 가상 함수를 얻을 수 있습니까? 당신이 생성자에서 하나를 호출

번호, 그것은 초기화되는 클래스 (이 경우 Body),하지가 아직 초기화되지 않았기 때문에 최종 overrider (에 따라 파견, 그래서 수 없습니다 안전하게 액세스).

또는 해당 클래스의 모델을 만들기 위해 생성자를 변경해야합니까?

아마도 가장 간단한 해결책 일 것입니다. 모델을 생성자 인수로 Body에 전달하는 것이 좋습니다. 그런 식으로 설정하는 것을 잊는 것은 불가능합니다.

0

mathematician1975가 지적한 것처럼 절대은 생성자 또는 소멸자 내에서 가상 메서드를 사용합니다.

생성자가 생성하는 개체는까지 생성자 클래스 으로 간주 할 수 없습니다. 제어 흐름이 생성자를 벗어납니다. Craft의 생성자 내부에서 가상 메서드를 호출 할 때마다 항상 Body 메서드를 호출하게됩니다.

모델을 설정하면 파일에서 메쉬를로드하는 것이 일반적으로 매우 비용이 많이 드는 작업이기 때문에 실제로 모델을 요청할 때까지, 즉 모델을 요청할 때까지하지 않는 것이 좋습니다. 이 시점에서 가상은 예상대로 작동해야합니다.

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

클래스 크래프트에 키워드 virtual을 사용하지 마십시오.

+1

'virtual'이 유효합니다. 지원되는 경우'override'가 더 좋습니다. 그리고 그것은 어쨌든 OP 문제와 관련이 없습니다. – Jarod42