二重调度(六):继承与模拟虚函数表

本文探讨了在游戏开发中,如何通过虚函数体系解决不同类型对象间的碰撞处理问题。特别是当引入新的子类如MilitaryShip时,如何确保原有的碰撞处理函数能够正确调用而不引发异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们还有一个问题需要处理。 (如果,此时你奇怪老有最后一个问题要处理,你将
认识到设计一个虚函数体系的难度。 )我们所做的一切将工作得很好,只要我们不需要在调用碰撞处理函数时进行向基类映射的类型转换。 假设我们开发的这个游戏某些时刻必须区分贸易飞船和军事飞船,我们将对继承体系作如下修改,根据 Item M33的原则,将实体类CommercialShip和MilitaryShip从抽象类SpaceShip继承。 
 


假设贸易飞船和军事飞船在碰撞过程中的行为是一致的。于是,我们期望可以使用相

同的碰撞处理函数(在增加这两类以前就有的那个) 。尤其是,在一个MilitaryShip对象和一个Asteroid对象碰撞时,我们期望调用 


void shipAsteroid(GameObject& spaceShip, 

                  GameObject& asteroid); 


它不会被调用的。实际上,抛了一个UnknownCollision的异常。因为lookup在根据

类型名“MilitaryShip”和“Asteroid”在collisionMap中查找函数时没有找到。虽然MilitaryShip可以被转换为一个SpaceShip,但lookup却不知道这一点。 


而且,没有没有一个简单的办法来告诉它。如果你需要实现二重调度,并且需要这儿
的向上类型映射,你只能采用我们前面讨论的二次虚函数调用的方法(同时也意味着增加新类的时候,所有人都必须重新编译) 。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值