一. 定義
雙分派是指:接受者和參數都能在運行時決定它的類型。(從而若有同名函數的話,依參數選定目標函數)
二. 問題的提出
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設計模式