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
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).