C++之动态联编
首先來看看百度百科的聯(lián)編定義:
聯(lián)編是指一個計算機(jī)程序自身彼此關(guān)聯(lián)(使一個源程序經(jīng)過編譯、連接,成為一個可執(zhí)行程序)的過程,在這個聯(lián)編過程中,需要確定程序中的操作調(diào)用(函數(shù)調(diào)用)與執(zhí)行該操作(函數(shù))的代碼段之間的映射關(guān)系,按照聯(lián)編所進(jìn)行的階段不同,可分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編。
靜態(tài)聯(lián)編
靜態(tài)聯(lián)編又稱靜態(tài)束定、早期聯(lián)編、前期聯(lián)編。
靜態(tài)聯(lián)編是指聯(lián)編工作是在程序編譯連接階段進(jìn)行的,靜態(tài)聯(lián)編又稱早期聯(lián)編,因?yàn)檫@種聯(lián)編是在程序開始運(yùn)行之前完成的。在程序編譯階段進(jìn)行的這種聯(lián)編又稱靜態(tài)束定,在編譯時就解決了程序中的操作調(diào)用與執(zhí)行該操作代碼間的關(guān)系,確定這種關(guān)系又被稱為束定,編譯時束定又稱為靜態(tài)束定。
特點(diǎn):
調(diào)用速度快,效率高。
動態(tài)聯(lián)編
動態(tài)聯(lián)編又稱動態(tài)關(guān)聯(lián)、動態(tài)束定、后期聯(lián)編、晚期聯(lián)編。
動態(tài)聯(lián)編是指編譯程序在編譯階段并不能確切地知道將要調(diào)用的函數(shù),只有在程序執(zhí)行時才能確定將要調(diào)用的函數(shù),為此要確切地知道將要調(diào)用的函數(shù),要求聯(lián)編工作在程序運(yùn)行時進(jìn)行,這種在程序運(yùn)行時進(jìn)行的聯(lián)編工作被稱為動態(tài)聯(lián)編。C++規(guī)定:動態(tài)聯(lián)編是在虛函數(shù)的支持下實(shí)現(xiàn)的。
動態(tài)聯(lián)編必須包括以下方面:
1、成員函數(shù)必須聲明為virtual
2、如果基類中聲明了為虛函數(shù),則派生類中不必再聲明。
調(diào)用方式:
通過對象的指針或引用調(diào)用成員函數(shù),或通過成員函數(shù)調(diào)用,反之就無法實(shí)現(xiàn)動態(tài)聯(lián)編。
特點(diǎn):
靈活,問題抽象性和問題的易維護(hù)性。
?
百度百科真是越寫越好了,繼續(xù)加油。
?
動態(tài)聯(lián)編在運(yùn)行時確定了使用基類還是子類的函數(shù),這就是C++實(shí)現(xiàn)多態(tài)的手段。從本質(zhì)上來講,多態(tài)是想是實(shí)現(xiàn)模板編程,這種思想在我看來既能說是面向?qū)ο蟮奶卣?#xff0c;也可以說是一種新的編程思路。盡可能的實(shí)現(xiàn)代碼復(fù)用,或者說是一個方法名稱實(shí)現(xiàn)某一種類似行為。
#include<iostream>using std::cout; using std::endl;class Parent { public:virtual void show() //虛函數(shù)show{cout << "parent" << endl;} };class Son : public Parent { public:void show(){cout << "son" << endl;} };void fun(Parent& p) {p.show(); }int main() {Parent* p = nullptr;p = new Son;Parent p1;fun(p1); //父類fun(*p); //子類delete p;p = nullptr;return 0; }fun的參數(shù)是p1的時候,將會調(diào)用父類的show函數(shù),而參數(shù)是*p的時候會調(diào)用子類的show函數(shù)。這就動態(tài)聯(lián)編,這運(yùn)行的時候確定是哪一個函數(shù)。
作為參照,我們來看看靜態(tài)聯(lián)編的效果。
#include<iostream>using std::cout; using std::endl;class Parent { public:virtual void show() //虛函數(shù)show{cout << "parent" << endl;}void put(){cout << "基類" << endl;} };class Son : public Parent { public:void show(){cout << "son" << endl;}void put(){cout << "派生類" << endl;} };void fun(Parent& p) {p.show(); }void fun(Parent& p,int) //使用占位參數(shù)重載fun。 {p.put(); }int main() {Parent* p = nullptr;p = new Son;Parent p1;fun(p1); //父類fun(*p); //子類cout << endl;fun(p1, 1); //父類fun(*p, 1); //子類delete p;p = nullptr;return 0; }結(jié)果如下:
很明顯,靜態(tài)聯(lián)編在編譯的時候就和被調(diào)函數(shù)綁定了,只會去調(diào)用基類的put成員函數(shù),根本不會調(diào)用派生類重寫的put成員。
基類一般把派生類需要重定義的任意函數(shù)定義為虛函數(shù)。
除了構(gòu)造函數(shù)和static成員函數(shù)之外,其余的函數(shù)都可以被virtual修飾成為虛函數(shù)。
一旦有了虛函數(shù),那么就將發(fā)生多態(tài)。
?
總結(jié)
- 上一篇: win10远程登录Ubuntu14.04
- 下一篇: OpenCV C++案例实战六《绿幕视频