C++之动态联编
首先來看看百度百科的聯編定義:
聯編是指一個計算機程序自身彼此關聯(使一個源程序經過編譯、連接,成為一個可執行程序)的過程,在這個聯編過程中,需要確定程序中的操作調用(函數調用)與執行該操作(函數)的代碼段之間的映射關系,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。
靜態聯編
靜態聯編又稱靜態束定、早期聯編、前期聯編。
靜態聯編是指聯編工作是在程序編譯連接階段進行的,靜態聯編又稱早期聯編,因為這種聯編是在程序開始運行之前完成的。在程序編譯階段進行的這種聯編又稱靜態束定,在編譯時就解決了程序中的操作調用與執行該操作代碼間的關系,確定這種關系又被稱為束定,編譯時束定又稱為靜態束定。
特點:
調用速度快,效率高。
動態聯編
動態聯編又稱動態關聯、動態束定、后期聯編、晚期聯編。
動態聯編是指編譯程序在編譯階段并不能確切地知道將要調用的函數,只有在程序執行時才能確定將要調用的函數,為此要確切地知道將要調用的函數,要求聯編工作在程序運行時進行,這種在程序運行時進行的聯編工作被稱為動態聯編。C++規定:動態聯編是在虛函數的支持下實現的。
動態聯編必須包括以下方面:
1、成員函數必須聲明為virtual
2、如果基類中聲明了為虛函數,則派生類中不必再聲明。
調用方式:
通過對象的指針或引用調用成員函數,或通過成員函數調用,反之就無法實現動態聯編。
特點:
靈活,問題抽象性和問題的易維護性。
?
百度百科真是越寫越好了,繼續加油。
?
動態聯編在運行時確定了使用基類還是子類的函數,這就是C++實現多態的手段。從本質上來講,多態是想是實現模板編程,這種思想在我看來既能說是面向對象的特征,也可以說是一種新的編程思路。盡可能的實現代碼復用,或者說是一個方法名稱實現某一種類似行為。
#include<iostream>using std::cout; using std::endl;class Parent { public:virtual void show() //虛函數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的參數是p1的時候,將會調用父類的show函數,而參數是*p的時候會調用子類的show函數。這就動態聯編,這運行的時候確定是哪一個函數。
作為參照,我們來看看靜態聯編的效果。
#include<iostream>using std::cout; using std::endl;class Parent { public:virtual void show() //虛函數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) //使用占位參數重載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; }結果如下:
很明顯,靜態聯編在編譯的時候就和被調函數綁定了,只會去調用基類的put成員函數,根本不會調用派生類重寫的put成員。
基類一般把派生類需要重定義的任意函數定義為虛函數。
除了構造函數和static成員函數之外,其余的函數都可以被virtual修飾成為虛函數。
一旦有了虛函數,那么就將發生多態。
?
總結
- 上一篇: win10远程登录Ubuntu14.04
- 下一篇: 带你彻底搞懂MyBatis的底层实现之缓