前幾次寫了一下關于c++不支持多分派(包括雙分派)的問題,應該說是學習了,本人還是個菜鳥啊。
發現我自己把多分派給搞復雜了!其實雙分派這個概念也是從學visitor模式看到的,其意義在于接受者和參數都能在運行時決定它的類型,但是c++只支持單分派,也就是說參數的類型將在編譯階段決定。所以其實想要演示一下這個問題的話,其實,是非常簡單的!如下:
///////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
class BE;
//B
class B
{
public:
?void virtual output(B * b){cout << "B:B" << endl;}
?void virtual output(BE * be){cout << "B:BE" << endl;}
};
class BE : public B
{
public:
?void output(B * b){cout << "BE:B" << endl;}
?void output(BE * be){cout << "BE:BE" << endl;}
};
int main()
{
??? B * p1 = new BE;
??? B * p2 = new BE;
??? p1->output(p2);
?
?return 0;
}
///////////////////////////////////////////////////////////////////
如果參數能夠在運行時決定類型的話,那么輸出來的信息應該是BE:BE,因為p2的實際類型是BE。但是,事實上輸出來的結果是BE:B。也就是說p2的類型被誤解為B了!這就是問題的所在了。
把簡單的事情搞復雜了,那真是折騰啊,呵呵。
Over。
發現我自己把多分派給搞復雜了!其實雙分派這個概念也是從學visitor模式看到的,其意義在于接受者和參數都能在運行時決定它的類型,但是c++只支持單分派,也就是說參數的類型將在編譯階段決定。所以其實想要演示一下這個問題的話,其實,是非常簡單的!如下:
///////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
class BE;
//B
class B
{
public:
?void virtual output(B * b){cout << "B:B" << endl;}
?void virtual output(BE * be){cout << "B:BE" << endl;}
};
class BE : public B
{
public:
?void output(B * b){cout << "BE:B" << endl;}
?void output(BE * be){cout << "BE:BE" << endl;}
};
int main()
{
??? B * p1 = new BE;
??? B * p2 = new BE;
??? p1->output(p2);
?
?return 0;
}
///////////////////////////////////////////////////////////////////
如果參數能夠在運行時決定類型的話,那么輸出來的信息應該是BE:BE,因為p2的實際類型是BE。但是,事實上輸出來的結果是BE:B。也就是說p2的類型被誤解為B了!這就是問題的所在了。
把簡單的事情搞復雜了,那真是折騰啊,呵呵。
Over。