多態(tài)性
多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性之一,從字面意思上可以簡單理解就是:多種形態(tài),多個(gè)樣子。其實(shí)本質(zhì)意思也是這樣,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,指同樣的方法被不同對象執(zhí)行時(shí)會有不同的執(zhí)行效果。
具體來說,多態(tài)的實(shí)現(xiàn)又可以分為兩種:編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。前者是編譯的時(shí)候就確定了具體的操作過程,后者是在程序運(yùn)行過程中才確定的操作過程。這種確定操作過程的就是聯(lián)編,也稱為綁定。
聯(lián)編在編譯和連接時(shí)確認(rèn)的,叫做靜態(tài)聯(lián)編,前面我們學(xué)習(xí)的函數(shù)重載、函數(shù)模板的實(shí)例化就屬于這一類。另一種是在運(yùn)行的時(shí)候,才能確認(rèn)執(zhí)行哪段代碼的,叫做動態(tài)聯(lián)編,這種情況是編譯的時(shí)候,還無法確認(rèn)具體走哪段代碼,而是程序運(yùn)行起來之后才能確認(rèn)。
兩者相比之下,靜態(tài)聯(lián)編由于編譯時(shí)候就已經(jīng)確定好怎么執(zhí)行,因此執(zhí)行起來效率高;而動態(tài)聯(lián)編想必雖然慢一些,但優(yōu)點(diǎn)是靈活。兩者各有千秋,有各自不同的使用場景。
下面,我們圍繞靜態(tài)聯(lián)編,給大家舉一個(gè)簡單例子:
/************************************** //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; } 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; }
定義了兩個(gè)類,一個(gè)圓點(diǎn)類,一個(gè)派生出來的圓類,可以看到主函數(shù)的代碼,四個(gè)輸出面積的結(jié)果,結(jié)果如下:
大家可以對照代碼理解四個(gè)輸出:
第一個(gè)cout輸出A的面積,是Point類中的area方法,面積為0,沒有問題。
第二個(gè)cout輸出B的面積,很明顯是派生類Circle的area方法,面積自然按公式計(jì)算得出1256.64的值,也沒問題。
第三個(gè)cout輸出的是Point類型指針p指向的Circle類對象的area方法,它輸出了0很明顯是執(zhí)行了Point類里的area方法。這里C++實(shí)行的是靜態(tài)聯(lián)編,即在編譯的時(shí)候就依據(jù)p的類型來定執(zhí)行哪個(gè)area,因此是0。
第四種cout也同理,把Circle類型的對象賦給Point類型的引用,C++同樣實(shí)行靜態(tài)聯(lián)編,也輸出0。
很明顯,這不是我們更期望的結(jié)果,實(shí)際上,對于指針、引用,我們更希望執(zhí)行實(shí)際對象的方法,而不是因?yàn)檫@個(gè)指針、引用的類型而盲目的確定,這就是如果這么寫存在的問題。
如果想達(dá)到我們的要求,即無論指針和引用為什么類型,都以實(shí)際所指向的對象為依據(jù)靈活決定。那么就要更改這種默認(rèn)的靜態(tài)聯(lián)編的方法,采用動態(tài)聯(lián)編,即在運(yùn)行的時(shí)候靈活決定。
下一節(jié),虛函數(shù)為大家詳細(xì)解釋!
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)課程