一. 定義
雙分派是指:接受者和參數(shù)都能在運行時決定它的類型。(從而若有同名函數(shù)的話,依參數(shù)選定目標函數(shù))
二. 問題的提出
C++ 不支持雙分派,只支持單分派。也就是說參數(shù)的類型將在編譯階段決定。(雖然遇上同名函數(shù)的選取時,沒有體現(xiàn)多態(tài),但進入函數(shù)后,指針參數(shù)或引用參數(shù)仍然表現(xiàn)了其多態(tài))
下面的代碼演示了該問題:
#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;
}
以上代碼的輸出結(jié)果是:
D:B
如果參數(shù)能夠在運行時決定類型的話,那么輸出來的信息應該是D:D,因為p2的實際類型是D。但是,事實上輸出來的結(jié)果是D:B。也就是說p2的類型被誤解為B了!這就是問題的所在。
三. 解決方法
Visitor設計模式