派生类型对象的调用方法
Call method for objects of derived type
我有一些类型层次:
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()
重载。编译器显然不知道你在循环中传递的对象的真正类型是什么,所以它选择它唯一确定的东西。
一般来说,有各种方法可以解决这个问题,谷歌"双重调度"或"访问者模式"。
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法