派生类型对象的调用方法

时间:2016-11-04 18:59:45

标签: c++ polymorphism

我有一些类型层次结构:

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;)。为什么?

2 个答案:

答案 0 :(得分:0)

这些是指向GameObject的指针。您取消引用它们并获取GameObject类型的对象,这是有道理的。如果您取消引用指向int的指针并获得类型为Apple的对象,则会非常奇怪。

GameObject *指针GameObject)意味着该指针指向存在一些内存,并且该内存应该被视为类型的对象GameObject。当您取消引用指针时,实际上访问到该内存,显然被视为GameObject

答案 1 :(得分:0)

在程序编译期间选择

foo()要调用的重载。编译器显然不知道你在循环中传递的对象的真实类型是什么,所以它选择了唯一知道的东西。

一般来说,有多种方法可以解决这个问题,google&#34; double dispatch&#34;或&#34;访客模式&#34;。