環境:VS2010
代碼:
#include <iostream>
using namespace std;
class A{
public:
virtual void func1(int i){
cout <<"A::func1()"<<endl;
}
virtual int func2(float f){
cout <<"A::func2()"<<endl;
return 0;
}
};
class B:public A{
virtual void func1(int i){
cout <<"B::func1()"<<endl;
}
virtual int func2(int i){
cout <<"B::func2()"<<endl;
return 0;
}
};
int main(void){
B b;
A *p = &b;
p->func1(0);
p->func2(0);
return 0;
}
讀者可以考慮輸出結果。
www.2cto.com
運行效果截圖:
分析:指針p是指向派生類的基類指針,派生類B裡的fun2:virtual int func2(int i),基類A裡的func2:virtual int func2(float f),仔細觀察它們的參數類型不一致,自然p->func2(0);這句話的輸出是基類的虛函數的內容,即使它傳的參數是int型(匹配到基類的虛函數後,參數自動轉換成float)。
總結:若要是虛函數的機制有效,則派生類的虛函數必須和基類的虛函數完成一致(當然從基類繼承的派生類裡的虛函數可以不加virtual)