一. 定义
双分派是指:接受者和参数都能在运行时决定它的类型。(从而若有同名函数的话,依参数选定目标函数)
二. 问题的提出
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设计模式