Design&Art

C++博客 首页 新随笔 联系 聚合 管理
  26 Posts :: 0 Stories :: 38 Comments :: 0 Trackbacks
一. 定义
双分派是指:接受者和参数都能在运行时决定它的类型。(从而若有同名函数的话,依参数选定目标函数)

二. 问题的提出
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设计模式
posted on 2007-09-19 16:18 安帛伟 阅读(1313) 评论(1)  编辑 收藏 引用 所属分类: C++

Feedback

# re: 双分派(double dispatch) 2012-03-08 14:10 陶陶
Visitor模式是基于双分派的,大哥!~  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理