如下面的程序:
#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;
}
開始的時候感覺有點迷惑,被調(diào)用的是 base 的 f 呢?還是 derived 的 f(需要進(jìn)行參數(shù)類型轉(zhuǎn)換)。實驗證明,被調(diào)用的是 base 的 f。
因為重載是根據(jù)靜態(tài)類型來選擇函數(shù)的,亦即由 pb 本身的類型來決定。而虛擬則是根據(jù)動態(tài)類型來選擇函數(shù),由 pb 指向的對象類型決定。因此編譯器首先根據(jù)重載來選擇一個基類的函數(shù),如果該函數(shù)為虛擬函數(shù)且被派生類實現(xiàn),則再通過多態(tài)機(jī)制調(diào)用派生類函數(shù)。
文章來源:
http://my.donews.com/robinchow/2007/01/11/ocipmucddsvoutkpnwjgeqrlwadgilgxnoma/