游戏引擎:dynamic_cast - 对象 class 不是多态类型
GAME ENGINE : dynamic_cast - Object class is not a polymorphic type
首先,我正在尝试创建一个与 Unity 架构相似的游戏引擎。我有一个对象 class,一个继承自对象的游戏对象 class。在 GameObject class 中,我正在尝试制作一个模板 class,它可以让你将任何组件添加到游戏对象上,尽管我遇到了一个我似乎无法解决的动态指针转换错误。
这是游戏对象 class:
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:
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 应该总是至少有一个虚拟析构函数,然后你就不会再得到这个错误。
例如,以下将显示您遇到的错误:
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);
首先,我正在尝试创建一个与 Unity 架构相似的游戏引擎。我有一个对象 class,一个继承自对象的游戏对象 class。在 GameObject class 中,我正在尝试制作一个模板 class,它可以让你将任何组件添加到游戏对象上,尽管我遇到了一个我似乎无法解决的动态指针转换错误。
这是游戏对象 class:
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:
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 应该总是至少有一个虚拟析构函数,然后你就不会再得到这个错误。
例如,以下将显示您遇到的错误:
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);