虛擬函式

大發指定邀請碼註冊88886486發表於2012-07-10

首先引出,我們的新知識點—虛擬函式(virtual function)

這是一種什麼函式呢? 簡單講,就是一個函式前面用virtual宣告的函式,一般形式如下:

virtual 函式返回值 函式名(形參)

{

 函式體

}

那它有什麼用呢? 虛擬函式的出現,允許函式在呼叫時與函式體的聯絡在執行的時候才建立,即所謂的動態聯編。那麼在虛擬函式的派生類的執行時候,就可以在執行的時候根據動態聯編實現都是執行一個方法,卻出現不同結果的效果,就是所謂的多型。這樣解決上一節的問題就有了辦法。

接下來,我們只需要把基類中的area方法宣告為虛擬函式,那麼主函式中無論Point型別的指標還是引用就都可以大膽呼叫,無用關心型別問題了。因為他們會依據實際指向的物件型別來決定呼叫誰的方法,來實現動態聯編。

程式碼如下:

/********************************** //Des:C++教程demo //Author:Huang //Copyright:www.dotcpp.com //Date:2017/12/20 **********************************/

include

using namespace std;

define PI 3.1415926

class Point { private: int x,y;

public: Point(int x=0,int y=0) { this->x = x; this->y = y; } virtual double area() { return 0.0; } }; class Circle:public Point { private: int r; public: Circle(int x,int y,int R):Point(x,y) { r = R; } double area() { return PI*r*r; } };

int main() {

Point A(10,10);
cout<<A.area()<<endl;
Circle B(10,10,20);
cout<<B.area()<<endl;
Point *p;
p = &B;
cout<<p->area()<<endl;
Point &pp=B;
cout<<pp.area()<<endl;
return 0;

} 修改後編譯執行如下:

602.png

大家請自行上機實驗,體會虛擬函式及多型的作用。

需要注意的是:

  1. 虛擬函式不能是靜態成員函式,或友元函式,因為它們不屬於某個物件。

  2. 行內函數不能在執行中動態確定其位置,即使虛擬函式在類的內部定義,編譯時,仍將看作非內聯,

  3. 建構函式不能是虛擬函式,解構函式可以是虛擬函式,而且通常宣告為虛擬函式。

相關文章