我:虛函數是C++實現多態的一種方式,基類的函數被聲明為virtual后,派生類可以根據需要重寫基類中的虛函數,實現同一調用方式實現不同效果。如果基類中的函數被聲明為純虛函數,該基類就變成一個抽象類,則派生類必須重寫該純虛函數。
書本解釋:
C++在調用函數的時候,會把該調用與合適的函數定義相匹配,這種匹配發生在編譯器,也稱為靜態綁定。
也可以告訴編譯器,把函數調用與函數定義之間的匹配放到運行期去做,稱為動態綁定。
如果使用了virtual,則編譯器會對該函數做動態綁定。
靜態綁定:
#include <iostream>
using namespace std;
class A
{
public:
void f()
{
cout<<"Base class A"<<endl;
}
};
class B :public A
{
public:
void f()
{
cout<<"Class B"<<endl;
}
};
void g(A &arg)
{
arg.f();
}
int main()
{
B x;
g(x);//g函數的參數是A類,傳入的是B類
return 0;
}
執行函數g()時,雖然其參數所指的對象是B類型,但實際被調用的卻是A類里的f();
因為編譯器在編譯期只知道g()函數的參數所引用的那個對象其類型派生自A類,但是它並不清楚這個類型究竟是A還是B。
動態綁定:
把A類中的void f()函數加上virtual聲明
那么函數就會調用到B類的f();在運行期確定要調用的函數,可以明確的知道參數是B類。