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

三. 解決方法
Visitor設(shè)計(jì)模式