上次寫了一下,結果漏洞百出,sigh。不過在高手的批評下,本人再多try了幾下,似乎又明白了不少,呵呵。如果有問題,請各位高手不吝賜教。謝謝哈!
下面演示了一下c++不支持雙分派。一共有四各類,A, AD, B, BE, 其中AD是A的子類,BE是B的子類。他們都有一個叫output的函數(函數名不一定要一樣的)。問題出現在哪里呢?問題出現在A或AD類中output函數里的b->output(a);這個語句。其中b是能夠動態track到他自己的類型的,但是a就不行了!因為它已經被靜態綁定到A類型了,所以輸出結果是:
output信息:
///////////////////////////////
AD:BE
BE:A //如果正確的話,這里應該輸出BE:AD
AD:B
B:A? //如果正確的話,這里應該輸出B:AD
AD:BE
BE:A
A:B
B:A
///////////////////////////////
現在把接口改成AD*a, 顯示出錯信息:
error: invalid conversion from `A*' to `AD*'
///////////////////////////////
現在把b->output(a)改成b->output(this),輸出結果如下:
AD:BE
BE:AD
AD:B
B:AD
AD:BE
BE:A
A:B
B:A
///////////////////////////////
結果就正確了!因為this顯然已經指向了正確的類型,而且也沒有經過中間步驟地轉換,所以其信息還是能夠runtime找到的。
over。
不知上面的解釋是否正確,如果有問題,請各位高手賜教了。小弟先謝謝了。
代碼如下:
////////////////////////////////////
#include <iostream>
#include <list>
using namespace std;
class A;
class AD;
//B
class B
{
public:
?void virtual output(A * a){cout << "B:A" << endl;}
?void virtual output(AD * ad){cout << "B:AD" << endl;}
};
class BE : public B
{
public:
?void output(A * a){cout << "BE:A" << endl;}
?void output(AD * ad){cout << "BE:AD" << endl;}
};
//A
class A
{
public:
?void virtual output(B * b, A * a){cout << "A:B" << endl;b->output(a);}
?void virtual output(BE * b, A * a){cout << "A:BE" << endl;b->output(a);}
};
class AD : public A
{
public:
?void output(B * b, A * a){cout << "AD:B" << endl;b->output(a);}
?void output(BE * b, A * a){cout << "AD:BE" << endl;b->output(a);}
};
int main()
{
??? A * pAD = new AD;
??? pAD->output(new BE, pAD);
??? pAD->output(new B, pAD);
cout<<endl;
??? A * pA = new A;
??? pA->output(new BE, pA);
??? pA->output(new B, pA);
?
?return 0;
}
下面演示了一下c++不支持雙分派。一共有四各類,A, AD, B, BE, 其中AD是A的子類,BE是B的子類。他們都有一個叫output的函數(函數名不一定要一樣的)。問題出現在哪里呢?問題出現在A或AD類中output函數里的b->output(a);這個語句。其中b是能夠動態track到他自己的類型的,但是a就不行了!因為它已經被靜態綁定到A類型了,所以輸出結果是:
output信息:
///////////////////////////////
AD:BE
BE:A //如果正確的話,這里應該輸出BE:AD
AD:B
B:A? //如果正確的話,這里應該輸出B:AD
AD:BE
BE:A
A:B
B:A
///////////////////////////////
現在把接口改成AD*a, 顯示出錯信息:
error: invalid conversion from `A*' to `AD*'
///////////////////////////////
現在把b->output(a)改成b->output(this),輸出結果如下:
AD:BE
BE:AD
AD:B
B:AD
AD:BE
BE:A
A:B
B:A
///////////////////////////////
結果就正確了!因為this顯然已經指向了正確的類型,而且也沒有經過中間步驟地轉換,所以其信息還是能夠runtime找到的。
over。
不知上面的解釋是否正確,如果有問題,請各位高手賜教了。小弟先謝謝了。
代碼如下:
////////////////////////////////////
#include <iostream>
#include <list>
using namespace std;
class A;
class AD;
//B
class B
{
public:
?void virtual output(A * a){cout << "B:A" << endl;}
?void virtual output(AD * ad){cout << "B:AD" << endl;}
};
class BE : public B
{
public:
?void output(A * a){cout << "BE:A" << endl;}
?void output(AD * ad){cout << "BE:AD" << endl;}
};
//A
class A
{
public:
?void virtual output(B * b, A * a){cout << "A:B" << endl;b->output(a);}
?void virtual output(BE * b, A * a){cout << "A:BE" << endl;b->output(a);}
};
class AD : public A
{
public:
?void output(B * b, A * a){cout << "AD:B" << endl;b->output(a);}
?void output(BE * b, A * a){cout << "AD:BE" << endl;b->output(a);}
};
int main()
{
??? A * pAD = new AD;
??? pAD->output(new BE, pAD);
??? pAD->output(new B, pAD);
cout<<endl;
??? A * pA = new A;
??? pA->output(new BE, pA);
??? pA->output(new B, pA);
?
?return 0;
}


