Kisser Leon

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

c++只支持单分派(single dispatch) 探讨2

Posted on 2007-03-13 11:36 kk 阅读(875) 评论(2)  编辑 收藏 引用 所属分类: C++
上次写了一下,结果漏洞百出,sigh。不过在高手的批评下,本人再多try了几下,似乎又明白了不少,呵呵。如果有问题,请各位高手不吝赐教。谢谢哈!
下面演示了一下c++不支持双分派。一共有四各类,A, AD, B, BE, 其中AD是A的子类,BE是B的子类。他们都有一个叫output的函数(函数名不一定要一样的)。问题出现在哪里呢?问题出现在A或AD类中output函数里的b->output(a);这个语句。其中b是能够动态track到他自己的类型的,但是a就不行了!因为它已经被静态绑定到A类型了,所以输出结果是:
output信息:
///////////////////////////////
AD:BE
BE:A //如果正确的话,这里应该输出BE:AD
AD:B
B:A  //如果正确的话,这里应该输出B:AD

AD:BE
BE:A
A:B
B:A

///////////////////////////////
现在把接口改成AD*a, 显示出错信息:
error: invalid conversion from `A*' to `AD*'
///////////////////////////////

现在把b->output(a)改成b->output(this),输出结果如下:
AD:BE
BE:AD
AD:B
B:AD

AD:BE
BE:A
A:B
B:A
///////////////////////////////
结果就正确了!因为this显然已经指向了正确的类型,而且也没有经过中间步骤地转换,所以其信息还是能够runtime找到的。
over。

不知上面的解释是否正确,如果有问题,请各位高手赐教了。小弟先谢谢了。



代码如下:
////////////////////////////////////
#include <iostream>
#include <list>
using namespace std;

class A;
class AD;
//B
class B
{
public:
 void virtual output(A * a){cout << "B:A" << endl;}
 void virtual output(AD * ad){cout << "B:AD" << endl;}
};
class BE : public B
{
public:
 void output(A * a){cout << "BE:A" << endl;}
 void output(AD * ad){cout << "BE:AD" << endl;}
};

//A
class A
{
public:
 void virtual output(B * b, A * a){cout << "A:B" << endl;b->output(a);}
 void virtual output(BE * b, A * a){cout << "A:BE" << endl;b->output(a);}
};
class AD : public A
{
public:
 void output(B * b, A * a){cout << "AD:B" << endl;b->output(a);}
 void output(BE * b, A * a){cout << "AD:BE" << endl;b->output(a);}
};

int main()
{
    A * pAD = new AD;
    pAD->output(new BE, pAD);
    pAD->output(new B, pAD);

cout<<endl;

    A * pA = new A;
    pA->output(new BE, pA);
    pA->output(new B, pA);
 
 return 0;
}

Feedback

# re: c++只支持单分派(single dispatch) 探讨2  回复  更多评论   

2007-03-13 13:28 by netdigger
class BE : public B
{
public:
void output(A * a){cout << "BE:A" << endl;}
void output(AD * ad){cout << "BE:AD" << endl;}
};

当你呼叫b->output(a)时,由A的类型决定,而A的类型又由上一层virtual output(B * b, A * a)决定,所以他只能调用output(A * a)

但是用this后,这个传递进去就是类对像本身的类型,所以能得到你想要得到的结果.
两个程序都没有错,错在你对函数的重载理解上..

# re: c++只支持单分派(single dispatch) 探讨2  回复  更多评论   

2007-03-13 14:36 by 小熊
不是很明白你的意思哦。
我觉得问题出在了,output(A * a)的时候,它被静态绑定到了A类型,而不是动态得runtime的得到它自己的类型哦。如果c++中能够动态的决定参数的类型的话,那么它应该调用的是output(AD * ad), 而不是output(A * a).

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