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