首先引出,我們的新知識要點-虛函數( virtual function )。
這是一種什麼函數呢?簡單來講,就是一個函數前面用virtual宣告的函數,一般形式如下:
virtual函數傳回值函數名稱(形參){函數體}那它有什麼用呢?虛函數的出現,允許函數在呼叫時與函數體的聯繫在運行的時候才建立,即所謂的動態聯編。那麼在虛函數的衍生類別的運行時候,就可以在運行的時候根據動態聯編實作都是執行一個方法,卻出現不同結果的效果,就是所謂的多態。這樣解決上一節的問題就有了辦法。
接下來,我們只需要把基類中的area方法宣告為虛函數,那麼主函數中無論Point類型的指標還是引用就都可以大膽調用,無用關心型別問題了。因為他們會依據實際指向的物件類型來決定呼叫誰的方法,來實作動態聯編。
程式碼如下:
/**************************************//Des:C++教學demo//Author: Huang//Copyright:www.dotcpp.com//Date:2017/12/20******************************* *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea(){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}修改後編譯運行如下:

大家請自行上機實驗,體會虛函數及多態的作用。
需要注意的是:
1. 虛函數不能是靜態成員函數,或是友元函數,因為它們不屬於某個物件。
2. 內聯函數不能在運行中動態決定其位置,即使虛函數在類別的內部定義,編譯時,仍將視為非內聯。
3. 建構函數不能是虛函數,析構函數可以是虛函數,而且通常宣告為虛函數。