有时,借用一下Jacqueline Susann的话:一次是不够的。例如你有着一个光辉形象、
崇高声望、丰厚薪水的程序员工作,在Redmond,Wshington的一个著名软件公司--当然,我说的就是任天堂。为了得到经理的注意,你可能决定编写一个video game。游戏的背景是发生在太空,有宇宙飞船、太空站和小行星。 
在你构造的世界中的宇宙飞船、太空站和小行星,它们可能会互相碰撞。假设其规则

是:

1、如果飞船和空间站以低速接触,飞船将泊入空间站。否则,它们将有正比于相对

速度的损坏。

2、如果飞船与飞船,或空间站与空间站相互碰撞,参与者均有正比于相对速度的损

坏。

3、如果小行星与飞船或空间站碰撞,小行星毁灭。如果是小行星体积较大,飞船或

空间站也毁坏。

4、如果两个小行星碰撞,将碎裂为更小的小行星,并向各个方向溅射。

这好象是个无聊的游戏,但用作我们的例子已经足够了,考虑一下怎么组织C++代码以
处理物体间的碰撞。 
我们从分析飞船、太空站和小行星的共同特性开始。至少,它们都在运动,所以有一

个速度来描述这个运动。基于这一点,自然而然地设计一个基类,而它们可以从此继承。实际上,这样的类几乎总是抽象基类,

class GameObject { ... }; 
class SpaceShip: public GameObject { ... }; 
class SpaceStation: public GameObject { ... };

class Asteroid: public GameObject { ... };

现在,假设你开始进入程序内部,写代码来检测和处理物体间的碰撞。你会提出这样
一个函数: 
void checkForCollision(GameObject& object1, 
                       GameObject& object2) 

  if (theyJustCollided(object1, object2)) { 
    processCollision(object1, object2); 
  } 
  else { 
    ... 
  }

}

问题来了。当你调用processCollision()时,你知道object1和object2正好相撞,
并且你知道发生的结果将取决于object1和object2的真实类型, 但你并不知道其真实类型;你所知道的就只有它们是GameObject对象。如果碰撞的处理过程只取决于object1的动态类型,你可以将processCollision()设为虚函数,并调用

object1.processColliion(object2)。 如果只取决于object2的动态类型, 也可以同样处理。但现在,取决于两个对象的动态类型。虚函数体系只能作用在一个对象身上,它不足以解决问题。 你需要的是一种作用在多个对象上的虚函数。C++没有提供这样的函数。可是,你必须要实现上面的要求。现在怎么办呢?

一种办法是扔掉C++,换种其它语言。比如,你可以改用CLOS(Common Lisp Object

System) 。CLOS支持绝大部分面向对象的函数调用体系中只能想象的东西:multi-method。multi-method是在任意多的参数上虚拟的函数,并且CLOS更进一步的提供了明确控制“被重载的multi-method将如何调用”的特性。

让我们假设,你必须用C++实现,所以必须找到一个方法来解决这个被称为“二重调度
(double dispatch) ” 的问题。
(这个名字来自于object-oriented programming community,在那里虚函数调用的术语是“message dispatch” ,而基两个参数的虚调用是通过“double dispatch”实现的,推而广之,在多个参数上的虚函数叫“multiple dispatch” 。 )有几个方法可以考虑。但没有哪个是没有缺点的,这不该奇怪。C++没有直接提供“double dispatch” ,所以你必须自己完成编译器在实现虚函数时所做的工作(见Item M24) 。如果容易的话,我们可能就什么都自己做了,并用C语言编程了。我们没有,而且我们也不能够,
所以系紧你的安全带,有一个坎途了。

二重调度(一):什么是二重调度?相关推荐

  1. 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )

    文章目录 一.调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 ) 二. 实时调度类 rt_sched_class 源码 一.调度类 ( 停机调度类 | 限期调度 ...

  2. 【Linux 内核】CFS 调度器 ② ( CFS 调度器 “ 权重 “ 概念 | CFS 调度器调度实例 | 计算进程 “ 实际运行时间 “ )

    文章目录 一.CFS 调度器 " 权重 " 概念 二.CFS 调度器调度实例 ( 计算进程 " 实际运行时间 " ) 一.CFS 调度器 " 权重 & ...

  3. 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )

    文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...

  4. 自动调度属于计算机领域的,调度自动化

    调度自动化是利用以电子计算机为核心的控制系统和远动技术实现电力系统调度的自动化,它包括安全监控.安全分析.状态估计.在线负荷预测.自动发电控制.自动经济调度等项内容.调度自动化是电力系统综合自动化的重 ...

  5. 【操作系统篇】第五篇——调度(概念,层次,调度时机,切换与过程,方式,评价指标)

    ​基本概念 ​三个层次 ​高级调度(作业调度) ​中级调度(内存调度) ​低级调度(进程调度) ​三层调度的联系,对比 ​补充知识 ​进程的"挂起态"与七状态模型 ​时机 ​什么时 ...

  6. 会话验证调度器_用视力调度建立会话式预订机器人

    会话验证调度器 Lego Party is my side hustle - Lego-themed entertainment like parties, classes, boozy Lego b ...

  7. 9.二重循环:什么是二重循环???

    9.二重循环:什么是二重循环??? 学习:第7遍 1.什么是二重循环??? 一个循环中嵌套着另一个循环,称为二重循环 各种循环可以互相嵌套 外层循环变量变化一次,内层循环变量要变化一遍 //某次技能大 ...

  8. Golang调度器GPM原理与调度全分析

    第一章 Golang调度器的由来 第二章 Goroutine调度器的GMP模型及设计思想 第三章 Goroutine调度场景过程全图文解析 一.Golang"调度器"的由来? (1 ...

  9. 无线对讲软交换调度服务器,应急指挥对讲调度SIP通信系统的功能介绍

    应急指挥对讲调度SIP通信系统既可以在平时作为行政办公使用 ,也可以随时通过调度台使用调度指挥功能 ,系统可以把办公领域.以及PSTN网络 通过企业信息化平台进行有效整合,在更大范围实现协同指挥调度. ...

  10. 分布式调度架构:共享状态调度

    分布式调度架构:共享状态调度 前言 什么是共享状态调度? 共享状态调度设计 Omega 调度架构 Omega 共享调度工作原理 知识扩展:单体调度.两层调度和共享调度的区别是什么? 总结 前言 在两层 ...

最新文章

  1. redis必杀高级:性能测试
  2. 计算机请说明您的专业知识与技能,湖南省2012对口招生考试计算机类专业综合考试大纲...
  3. hadoop大数据--深入讲解hdfs源码
  4. 从一个Android码农视角回顾2018GDD大会
  5. C++中类的拷贝控制
  6. Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器
  7. 注册表修改系统显示时间
  8. python snownlp_GitHub - isnowfy/snownlp: Python library for processing Chinese text
  9. VBA代码宝(列表框)20220402
  10. java 汇率换算_汇率转换示例代码
  11. transform: translateY(-100%)偏移实现上滑隐藏导航栏
  12. 无监督降维 效果评价 trustworthiness measure
  13. 2021-11-09 PMIC RK817 处理POWER键流程linux 部分的简单分析,dts 中会用 interrupt-parent interrupts去处理按键的中断。
  14. 聊天记录怎么录视频 微信聊天记录屏幕录制
  15. 计算机英语 教学大纲,计算机英语教学大纲
  16. OpenCV 双目相机录制的视频,左右图像分割
  17. 时间序列数据的白噪声检验
  18. 推荐一个朋友 - 学历不好,非科班,不负光阴终进大厂
  19. Endpoint的中文意思
  20. 以数字化视角看世界杯,我预测荷兰夺冠

热门文章

  1. word中怎样设置行距行高
  2. 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
  3. webhook是什么_敏锐度调度,Webhook和使整个业务按计划进行
  4. 通过抓包获取内涵段子的接口
  5. mysql表格时间函数大全_mysql汇总数据函数
  6. 19显示文字的区位码
  7. 关于eMule下载伤硬盘的话题
  8. 暴笑小笑话集(全是最新经典!)
  9. html转m3u8地址,[转]m3u8直播测试地址
  10. 微信在线客服 php,微信小程序中添加联系在线客服功能