C++Double Dispatch讲解和实例-面试题

引言

说实话,我看过GoF《Design
Patterns》,也早已深入的被李建忠《设计模式》系列Webcast吸引。但是还未曾呈现了“Double
Dispatch模式”。的确GoF提及的设计模式只是早期对设计模式的体系介绍,它不可能含有所有的模式。另外就岁月之蹉跎,技术日新月异的转移,技术大牛们以总发生了诸多初的模式。

今所介绍的Double
Dispatch模式,从时间及来拘禁,已非是新的设计模式;但对只有看罢GoF设计模式的技能同仁来说,也终于一个初的设计模式。

什么是DoubleDispatch?

针对,没有“模式”二配。从字面翻译来拘禁,网上广大总人口翻为双散发,双分摊。Wiki上针对Double
Dispatch的解释:

 

In software engineering, double dispatch is a special form of
multiple dispatch, and a mechanism that dispatches a function call to
different concrete functions depending on the runtime types of two
objects involved in the call. In most object-oriented systems, the
concrete function that is called from a function call in the code
depends on the dynamic type of a single object and therefore they are
known as single dispatch calls, or simply virtual function calls.

大意:

 

当软件工程被,Double Dispatch是如出一辙种植特有形式之Multiple
Dispatch,也是根据被少数单目标的运行时路来调用的该相应具体类(不是基类)方法的一致栽体制。在大部面向目标的系统面临,在代码(程序)中之一个函数调用具体类的方法还在单个对象的动态类型(运行时之型),(它们一般)被叫作Single
Dispath calls,或只是虚拟函数调用。

 

不难看出一次虚函数的调用叫做Single
Dispath ,那么Double Dispatch应该就是是少软虚函数的调用啦。

更进一步说不怕是一致赖通过动态类型(运行时路)调用相应子类真实类型的艺术函数,就称为一不良Dispath。那么为此类推,需要少不行通过运行时路调用相应类别的法子函数,则称之为Double
Dispatch。

 

举例说明:

Single Dispatch 实例:

C++ 1

DoubDispatch 实例:

否甚要干Double Dispatch?

 

C++ 2

C++ 3

C++ 4

输出结果

C++ 5

 

怎没有出口“Dog Type”和“Mammals Type”呢?不对呀!!

岂化解?

用Dynamic来解决

 

经查有关函数重载.aspx)决议有关的求证我们可以了解及:

重载是于编译时便决定了,所以无法以运作时动态控制。重写才是动态运行时操的。

C++ 6

输出结果:

C++ 7

如此的缓解虽然看起解决了问题?但本身无经Double Dispatch
来落实的。只是通过了Dynamic。

从而Vistor 模式来缓解

C++ 8

 

总结

C# 现在引入Dynamic 来支撑“Double
Dispatch”,但我们相应掌握究竟为何要为此是第一字.

一经没这个重大字,C#同时是何许支持“Dobule
Dispatch”的,这就算是本篇所讲的目的。

重新多关于Vistor内容,大家只是机关百度谷歌。

此起彼伏我想写一篇有关Vistor的博客,还请求大家多支持!

参考

设计模式随笔-让众口不再难调

Software design
pattern

GoF著作中未涉嫌的设计模式(4):Double
Dispatch

有关双分使(Double
Dispatch)的少数追(案例称的很透彻,C++的代码)

好C++不克形成的事 –
Visitor模式

Double dispatch in
C#?

Dynamic Dispatch in
C#

Acyclic
Visitor模式:http://www.objectmentor.com/resources/articles/acv.pdf

Hierachical Visitor
Pattern模式:http://en.wikipedia.org/wiki/Hierarchical_visitor_pattern