關於虛函數的問題
來源:互聯網
上載者:User
虛函數是定義在基類中的,定義為
virtual
的函數是基類期待衍生類別重新定義的,基類希望衍生類別繼承的函數不能定義為虛函數。定義虛函數的一個重點,我認為這也是虛函數存在的理由:支援動態綁定。
關於動態綁定在C++Primer中的解釋是:運行時類型。基類類型的指標和引用可以綁定到衍生類別型的對象,在這種情況下,靜態類型是基類引用(或指標),但動態類型是衍生類別引用(或指標)。通過基類的引用或指標調用定義為virtual的函數時會發生動態綁定,比如,如果調用非虛函數,則無論實際對象是什麼類型,都執行基類類型所定義的函數。如果調用虛函數,則直到運行時才能確定調用哪個函數,啟動並執行虛函數是引用所綁定的或指標所指向的對象所屬類型定義的版本。
我的朋友lizhaochai給了我幾個不錯的例子幫我理解,拿出來和大家分享一下。
#include<iostream>
using namespace std;
class s1
{
int i;
public:s1(){}
virtual void print(){cout<<"調用的是基類的print"<<endl;}
void f0(){ cout<<"調用的是基類的f0"<<endl;}
};
class s2:public s1
{
int a;
public: s2(){}
void print(){cout<<"調用的是衍生類別的print"<<endl;}
void f0(){ cout<<"調用的是子類的f0"<<endl;}
};
int main()
{
s2 x;
s1* p=&x;
p->f0();//大家認為這個輸出的是什麼呢?
p->print();
system("pause");
return 0;
}
這其中的fO()函數,不是虛函數,所以它不支援動態綁定,所輸出的自然是P(基類類型)所定義的函數。當然如果要用基類的指標訪問定義於衍生類別中的成員函數時,必須對指標進行類型轉換,將指標顯示轉換為衍生類別指標類型,如:((s2*)p)->print();
如果用衍生類別的指標訪問基類的成員函數時,同上。
這隻是我的一個小小總結,希望大家多指點。有不好的地方請指出。如果好的話,我可以給分。謝謝。