【问题标题】:GAME ENGINE : dynamic_cast - Object class is not a polymorphic type游戏引擎:dynamic_cast - 对象类不是多态类型
【发布时间】:2017-12-05 20:28:36
【问题描述】:

首先,我试图创建一个与 Unity 架构相似的游戏引擎。我有一个 Object 类,一个继承自 Object 的 GameObject 类。在 GameObject 类中,我正在尝试创建一个模板类,它可以让您将任何组件添加到游戏对象上,尽管我得到了一个我似乎无法解决的动态指针转换错误。

这是 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;


};

【问题讨论】:

    标签: c++ oop game-engine dynamic-cast template-classes


    【解决方案1】:

    该错误意味着您尝试从中投射的任何内容都没有任何虚拟成员。虚拟继承链的基类至少应始终具有虚拟析构函数,这样您就不会再收到此错误。

    例如,以下将显示您遇到的错误:

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

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 2023-03-16
      • 2022-07-27
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多