游戏引擎:Dynamic_cast-对象类不是多态类型

GAME ENGINE : dynamic_cast - Object class is not a polymorphic type

本文关键字:多态 类型 对象 cast- 引擎 Dynamic 游戏      更新时间:2023-10-16

首先,我试图创建具有与Unity相似的架构的游戏引擎。我有一个对象类,一个从对象继承的游戏对象类。在GameObject类中,我正在尝试完成一个模板类,该类将使您在游戏对象上添加任何组件,尽管我得到了一个动态的指针铸造错误,我似乎无法解决。

HER是GameObject类:

class GameObject : public Object 
{
public:
template<class T>
std::shared_ptr<T> addChildComponent()
{
    std::shared_ptr<T> temp_component(new T());
    temp_component->gameObject = std::dynamic_pointer_cast<GameObject>(shared_from_this());
    m_components.push_back(temp_component);
    return temp_component;
}
template<class T>
std::shared_ptr<T> getComponent()
{
    for (int i = 0; i < m_components.size(); i++)
    {
        std::shared_ptr<T> t;
        t = m_components.at(i);
        if (t.get() != NULL)
        {
            return t;
        }
    }
    return std::shared_ptr<T>();
}

此外,这是它继承的对象类:

class Object : public std::enable_shared_from_this<Object>
{
friend class GameObject;
public:
Object();
~Object();

void makeName(std::string _name);
std::string getName();
private:
std::string name;

};

错误意味着您试图从中施放的任何东西都没有任何虚拟成员。虚拟继承链的基类应始终具有至少一个虚拟破坏者,然后您将不再遇到此错误。

作为一个例子,以下内容将显示您遇到的错误:

class base1
{
int a;
};
class derived1: public base1
{};
...
derived1 d1;
base1 * pb1 =&d1;
derived1 * pd1 = dynamic_cast<derived1*>(pb1);

虽然下一个不会:

class base2
{
int a;
public:
virtual ~base1() {}
};
class derived2 : public base2
{};
...
derived2 d2;
base2 * pb2 = &d2;
derived2 * pd2 = dynamic_cast<derived2*>(pb2);