gpt4 book ai didi

C++重载重写的方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:48 26 4
gpt4 key购买 nike

在 C++ 中是否可以在子类中重载一个重写的方法?我问这个是因为我有很多子类,尽管它们是相同的(在我的例子中是游戏对象),但它们以不同的方式相互交互。
因此,我需要在父类(super class)中创建类似 void processCollision(GameObject obj) 的函数。
但这可能会在子类中重载,具体取决于 GameObject 的类(如果它是建筑物、汽车......)。

我只是想从使用向上转换和 RTTI 的替代方案运行。

最佳答案

您要实现的通常称为“multiple dispatch”,不幸的是 C++ 不直接支持它(因为在 C++ 中, View 方法与类绑定(bind)并且没有多方法)。

任何 C++ 解决方案都需要一些代码来实现。

实现它的一种简单对称方法是为支持的案例创建 map :

typedef void (*Handler)(Obj *a, Obj *b);
typedef std::map<std::pair<OType, OType>, Handler> HandlerMap;

HandlerMap collision_handlers;

那么碰撞处理是:

HandlerMap::iterator i =
collision_handlers.find(std::make_pair(a->type, b->type));
if (i != collision_handlers.end()) i->second(a, b);

代码进入一个自由函数。

如果速度是一个关键因素,并且对象类型可以用一个小整数(例如 0...255)编码,则调度可以变成例如:

collision_handlers[(a->type<<8)+b->type](a, b);

其中碰撞处理程序只是一个函数指针数组,速度应该相当于单个虚拟分派(dispatch)。

答案开头的维基百科链接列出了另一个更复杂的 C++ 选项(访问者模式)。

关于C++重载重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26493146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com