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

我正在创建继承 Body 的新类,想法是我在这些类中覆盖“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) );
}

但是,当我创建 Craft 的新实例时,它总是会创建一个 Cube 模型而不是我的 Viper 模式。

是否有可能让虚拟功能像我想的那样工作?还是我只需要更改构造函数以在各自的类中创建模型?

谢谢

4

3 回答 3

3

是否有可能让虚拟功能像我想的那样工作?

不。当您从构造函数调用 one 时,它​​是根据正在初始化的类(Body在这种情况下)而不是最终的覆盖器(因为尚未初始化,因此无法安全访问)进行调度。

还是我只需要更改构造函数以在各自的类中创建模型?

这可能是最简单的解决方案。我建议将模型作为构造函数参数传递给Body. 这样,就不可能忘记设置它。

于 2014-02-14T15:05:20.490 回答
1
class Craft : public Body
{
    protected:
        void setModel();
    public:
        Craft( core::vector3df Position, core::vector3df Rotation );
};

不要virtual在 Class Craft 中使用关键字。

于 2014-02-14T15:27:52.813 回答
0

就像 mathematician1975 指出的那样,你永远不应该在构造函数或析构函数中使用虚方法。

在控制流离开构造函数之前,构造函数正在构建的对象不能被视为构造函数的类。每当你在 Craft 的构造函数中调用一个虚方法时,你总是会调用 Body 的方法。

由于设置模型意味着从文件中加载网格,这通常是一项非常昂贵的操作,因此我建议您在真正需要它之前不要这样做,即每当您的模型被请求时。在这一点上,你的虚拟应该表现得像你期望的那样。

于 2014-02-14T15:26:34.293 回答