我有一些类型层次结构:
std::vector<GameObject*> objects;
// fill array ( pointers to Bullet, Enemy, Player)
foreach(auto obj1 : objects)
{
foreach(auto obj2 : objects)
{
if(obj1.getID() != obj2.getID()
{
foo(*obj1, *obj2);
}
}
}
在遍历GameObject *数组时,我检查条件并调用方法foo(* object1,* object2)(object1引用Bullet,object2引用Player)。
void foo(GameObject&, GameObject&)
void foo(Bullet&, Player&)
void foo(Bullet&, Enemy&)
我也写了一些重载的foo方法:
{{1}}
但只调用了foo(GameObject&amp;,GameObject&amp;)。为什么?
答案 0 :(得分:0)
这些是指向GameObject
的指针。您取消引用它们并获取GameObject
类型的对象,这是有道理的。如果您取消引用指向int
的指针并获得类型为Apple
的对象,则会非常奇怪。
GameObject *
(指针到GameObject
)意味着该指针指向存在一些内存,并且该内存应该被视为类型的对象GameObject
。当您取消引用指针时,实际上访问到该内存,显然被视为GameObject
。
答案 1 :(得分:0)
foo()
要调用的重载。编译器显然不知道你在循环中传递的对象的真实类型是什么,所以它选择了唯一知道的东西。
一般来说,有多种方法可以解决这个问题,google&#34; double dispatch&#34;或&#34;访客模式&#34;。