首先引出,我們的新知識點(diǎn)——虛函數(shù)(virtual function)。
這是一種什么函數(shù)呢?簡單來講,就是一個(gè)函數(shù)前面用virtual聲明的函數(shù),一般形式如下:
virtual 函數(shù)返回值 函數(shù)名(形參) { 函數(shù)體 }
那它有什么用呢?虛函數(shù)的出現(xiàn),允許函數(shù)在調(diào)用時(shí)與函數(shù)體的聯(lián)系在運(yùn)行的時(shí)候才建立,即所謂的動(dòng)態(tài)聯(lián)編。那么在虛函數(shù)的派生類的運(yùn)行時(shí)候,就可以在運(yùn)行的時(shí)候根據(jù)動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)都是執(zhí)行一個(gè)方法,卻出現(xiàn)不同結(jié)果的效果,就是所謂的多態(tài)。這樣解決上一節(jié)的問題就有了辦法。
接下來,我們只需要把基類中的area方法聲明為虛函數(shù),那么主函數(shù)中無論P(yáng)oint類型的指針還是引用就都可以大膽調(diào)用,無用關(guān)心類型問題了。因?yàn)樗麄儠罁?jù)實(shí)際指向的對象類型來決定調(diào)用誰的方法,來實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。
代碼如下:
/************************************** //Des:C++教程demo //Author:Huang //Copyright:www.sztianhecheng.cn //Date:2017/12/20 **************************************/ #include <iostream> 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; }
修改后編譯運(yùn)行如下:
大家請自行上機(jī)實(shí)驗(yàn),體會虛函數(shù)及多態(tài)的作用。
需要注意的是:
1. 虛函數(shù)不能是靜態(tài)成員函數(shù),或友元函數(shù),因?yàn)樗鼈儾粚儆谀硞€(gè)對象。
2. 內(nèi)聯(lián)函數(shù)不能在運(yùn)行中動(dòng)態(tài)確定其位置,即使虛函數(shù)在類的內(nèi)部定義,編譯時(shí),仍將看作非內(nèi)聯(lián)。
3. 構(gòu)造函數(shù)不能是虛函數(shù),析構(gòu)函數(shù)可以是虛函數(shù),而且通常聲明為虛函數(shù)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程