如下面的程序:
#include < iostream >
using namespace std;class base{
public:
virtual void f(char i){
cout << "Base class: " << i << endl;
};
virtual void f(double d){
cout << "Base class: " << d << endl;
}
};
class derived : public base{
public:
void f(char i){
cout << "Derived class: " << i << endl;
}
};
int main(int argc, char** argv)
{
base *pb = new derived;
pb->f(2.0);
delete pb;
return 0;
}
開(kāi)始的時(shí)候感覺(jué)有點(diǎn)迷惑,被調(diào)用的是 base 的 f 呢?還是 derived 的 f(需要進(jìn)行參數(shù)類型轉(zhuǎn)換)。實(shí)驗(yàn)證明,被調(diào)用的是 base 的 f。
因?yàn)橹剌d是根據(jù)靜態(tài)類型來(lái)選擇函數(shù)的,亦即由 pb 本身的類型來(lái)決定。而虛擬則是根據(jù)動(dòng)態(tài)類型來(lái)選擇函數(shù),由 pb 指向的對(duì)象類型決定。因此編譯器首先根據(jù)重載來(lái)選擇一個(gè)基類的函數(shù),如果該函數(shù)為虛擬函數(shù)且被派生類實(shí)現(xiàn),則再通過(guò)多態(tài)機(jī)制調(diào)用派生類函數(shù)。
文章來(lái)源:
http://my.donews.com/robinchow/2007/01/11/ocipmucddsvoutkpnwjgeqrlwadgilgxnoma/