我有一个关于多重继承的问题。在我的项目中,我想添加对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
,但这并没有帮助。现在它在更早的电话中崩溃了。