双分派(double dispatch)

双分派(double dispatch)
一. 定义
双分派是指:接受者和参数都能在运行时决定它的类型。(从而若有同名函数的话,依参数选定目标函数)

二. 问题的提出
C++ 不支持双分派,只支持单分派。也就是说参数的类型将在编译阶段决定。(虽然遇上同名函数的选取时,没有体现多态,但进入函数后,指针参数或引用参数仍然表现了其多态)
下面的代码演示了该问题:
#include  < iostream >
using   namespace  std;

class  D;

// B
class  B
{
public :
 
void   virtual  output(B  *  b){cout  <<   " B:B "   <<  endl;}
 
void   virtual  output(D  *  d){cout  <<   " B:D "   <<  endl;}
};
class  D :  public  B
{
public :
 
void  output(B  *  b){cout  <<   " D:B "   <<  endl;}
 
void  output(D  *  d){cout  <<   " D:D "   <<  endl;}
};

int  main()
{
    B 
*  p1  =   new  D;
    B 
*  p2  =   new  D;
    p1
-> output(p2);
 
 
return   0 ;
}
以上代码的输出结果是:
D:B
如果参数能够在运行时决定类型的话,那么输出来的信息应该是D:D,因为p2的实际类型是D。但是,事实上输出来的结果是D:B。也就是说p2的类型被误解为B了!这就是问题的所在。

三. 解决方法
Visitor设计模式

你可能感兴趣的:(双分派(double dispatch))