接口

时间:2015-09-30 16:36:29

标签: c++ inheritance interface vtable

我有一个关于多重继承的问题。在我的项目中,我想添加对dll插件的支持,并因此需要一个接口。在应用程序中,我创建了诸如播放器和可视对象之类的对象,并将它们交给dll界面。例如,dll只能将字符指针解释为ICharacter。我的问题发生在应用程序本身内:

class IGameObject
{
    virtual const std::string &getName(void) const = 0;
    virtual void setName(const std::string &name) = 0;
};

class IVob : public virtual IGameObject
{
    virtual const Math::Vec3 &getPosition(void) const = 0;
    virtual void setPosition(const Math::Vec3 &pos) = 0;
    // more pure virtual functions
};

class ICharacter : public virtual IVob
{
    // pure virtual functions
};

class GameObject : public virtual IGameObject
{
    GameObject();

    virtual const std::string &getName(void) const override;
    virtual void setName(const std::string &name) override;
    // more virtual function override
};

class Vob : public virtual IVob, public GameObject
{
    Vob(VobType type);

    virtual const Math::Vec3 &getPosition(void) const override;
    virtual void setPosition(const Math::Vec3 &pos) override;
    // more virtual function override
};

class Character : public ICharacter, public Vob
{
    Character();

    // virtual function override
};

假设字符是ICharacter

现在,如果我想调用character->setPosition(pos);它可能会崩溃,因为它是ICharacter指针。如果我reinterpret_cast<Character*>(character)->setPosition(pos);它,那么它可能正常工作。似乎vtable混乱了,但我无法看到发生的地方。如果我重新排序继承,它可能 - 在某些星座 - 工作。

流程如下:

创作(Character*) - &gt; dll接口(reinterpret_cast<ICharacter*>) - &gt;在dll接口中调用函数,它们是原始字符的100%部分

如果传回给应用程序:

dll interface(ICharacter*) - &gt;申请(reinterpret_cast<Character *>

我想念什么?

提前致谢

编辑:事实上,我尝试dynamic_cast,但这并没有帮助。现在它在更早的电话中崩溃了。

0 个答案:

没有答案