派生类型对象的调用方法

Call method for objects of derived type

本文关键字:调用 方法 对象 类型 派生      更新时间:2023-10-16

我有一些类型层次:

class GameObject{...};
class Subject:public GameObject{...};
class Player:public Subject{...};
class Bullet:public Subject{...};
class Enemy:public Subject{...};

在遍历GameObject*数组时,我检查条件并调用方法foo(*object1, *object2) (object1是Bullet的引用,object2是Player的引用)。

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

我还写了一些重载foo方法:

void foo(GameObject&, GameObject&)
void foo(Bullet&, Player&)
void foo(Bullet&, Enemy&)

但是只有foo(GameObject&, GameObject&)被调用。为什么?

这些是指向GameObject的指针。你对它们解引用,得到GameObject类型的对象,这是有意义的。如果你解引用了一个指向int的指针,得到了一个Apple类型的对象,那将是非常奇怪的。

GameObject * (a 指向GameObject的指针)意味着存在该指针指向的内存块,并且该内存应该被视为GameObject类型的对象。当你解引用一个指针时,你实际上获得了对该内存的访问,这显然被视为GameObject

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

一般来说,有各种方法可以解决这个问题,谷歌"双重调度"或"访问者模式"。