将父级转换回子级而不进行强制转换

时间:2016-06-12 15:30:52

标签: c++ polymorphism abstract-class

我正在为游戏创建一个碰撞系统并拥有一系列边界体积类(AABB,OBB,18DOP等),并且他们是#34; GameObjectElement"的孩子。 (抽象类)。每个游戏对象的想法可以包含GameObjectElements的向量。

问题是如果我创建一个AABB并将其附加到GameObject现在变成了GameObjectElement。但是,为了检查碰撞,我需要它是AABB而不是GameObjectElement。

我的第一直觉是使用铸造,但在大学期间,我的讲师鄙视这一点。我已经研究了多态性,向上转换和向下转换,但不能完全拼凑出一个解决方案(尽管我认为我已经完成了所有的工作)。

如果有人可以提出解决此问题的方法,我们将非常感激。

谢谢

2 个答案:

答案 0 :(得分:0)

如果要存储类层次结构的各种成员,通常使用指针。 (其他可能性是变体和相同大小的变色龙类)。这是因为向量需要存储相同类型和大小的元素。你需要的是在基类中进行冲突检查的纯虚函数(例如virtual bool collision(const int x, const int y) = 0),每个后代中的虚函数的实现(例如,virtual bool collision(const int x, const int y) { return x == m_x && y==m_y; })并存储指向base的指针向量(例如std::vector<GameObjectElement*> v)。然后 - 奇迹发生:) - 调用v[i]->collision(x, y)将调用后代中的适当实现。请确保使用new分配元素并使用delete取消分配 - 或者只使用shared_ptr<GameObjectElement>,如果您想在一个校准中使其变得非常简单。

答案 1 :(得分:0)

如果选择colission算法取决于两个实例的类型,那么您正在寻找 Double dispatch 机制,该机制可以使用访问者模式在c ++中实现

维基百科页面实际上有一个涵盖对象碰撞的例子:)

https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading