Kisser Leon

这个kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

再次探讨双分派double dispatch

Posted on 2007-03-13 16:02 kk 阅读(1212) 评论(2)  编辑 收藏 引用 所属分类: C++
前几次写了一下关于c++不支持多分派(包括双分派)的问题,应该说是学习了,本人还是个菜鸟啊。
发现我自己把多分派给搞复杂了!其实双分派这个概念也是从学visitor模式看到的,其意义在于接受者和参数都能在运行时决定它的类型,但是c++只支持单分派,也就是说参数的类型将在编译阶段决定。所以其实想要演示一下这个问题的话,其实,是非常简单的!如下:
///////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;

class BE;

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

int main()
{
    B * p1 = new BE;
    B * p2 = new BE;
    p1->output(p2);
 
 return 0;
}
///////////////////////////////////////////////////////////////////
如果参数能够在运行时决定类型的话,那么输出来的信息应该是BE:BE,因为p2的实际类型是BE。但是,事实上输出来的结果是BE:B。也就是说p2的类型被误解为B了!这就是问题的所在了。
把简单的事情搞复杂了,那真是折腾啊,呵呵。
Over。


Feedback

# re: 再次探讨双分派double dispatch  回复  更多评论   

2007-03-22 17:41 by 梦在天涯
o ,整了半天,安还是没有完全的明白哦

# re: 再次探讨双分派double dispatch  回复  更多评论   

2007-03-22 23:59 by 小熊
有什么不明白的阿?
欢迎提出来大家讨论讨论阿。虽然俺懂得也不多,呵呵

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