一、概述:
通常來說聯編就是將模塊或者函數合並在一起生成可執行代碼的處理過程,同時對每個模塊或者函數調用分配內存地址,並且對外部訪問也分配正確的內存地址,它是計算機程序彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜態聯編和動態聯編。
靜態聯編是指在編譯階段就將函數實現和函數調用關聯起來,因此靜態聯編也叫早綁定,在編譯階段就必須了解所有的函數或模塊執行所需要檢測的信息,它對函數的選擇是基於指向對象的指針(或者引用)的類型,C語言中,所有的聯編都是靜態聯編,並且任何一種編譯器都支持靜態聯編。
動態聯編是指在程序執行的時候才將函數實現和函數調用關聯,因此也叫運行時綁定或者晚綁定,動態聯編對函數的選擇不是基於指針或者引用,而是基於對象類型,不同的對象類型將做出不同的編譯結果。C++中一般情況下聯編也是靜態聯編,但是一旦涉及到多態和虛擬函數就必須要使用動態聯編了。下面將介紹一下多態。
多態:字面的含義是具有多種形式或形態。C++多態有兩種形式,動態多態和靜態多態;動態多態是指一般的多態,是通過類繼承和虛函數機制實現的多態;靜態多態是通過模板來實現,因為這種多態實在編譯時而非運行時,所以稱為靜態多態。
二、代碼實例:
動態多態實例如下:
#include <stdio.h> #include <iostream> /** *Shape */ class CShape { public: CShape(){} virtual ~CShape(){} virtual void Draw() = 0; }; /** *Point */ class CPoint : public CShape { public: CPoint(){} ~CPoint(){} void Draw() { printf("Hello! I am Point!/n"); } }; /** *Line */ class CLine : public CShape { public: CLine(){} ~CLine(){} void Draw() { printf("Hello! I am Line!/n"); } }; void main() { CShape* shape = new CPoint(); //draw point shape->Draw();//在這里shape將會調用CPoint的Draw()函數 delete shape; shape = new CLine(); //draw Line shape->Draw();//而在這里shape將會調用CLIne 的Draw()函數 delete shape; return ; }
大家可以考慮一下它的輸出結果,如果實在不知道,那就麻煩你運行一下它吧!
由上面的例子,大家應該能理解什么是多態了:也就是一個Draw() 可以有兩種實現,並且是在運行時決定的,在編譯階段不知道,也不可能知道!只有在運行的時候才能知道我們生成的shape是那種圖形,當然要實現這種效果就需要動態聯編了,在基類我們會把想要多態的函數聲明為虛函數,而虛函數的實現原理就使用了動態聯編。如果你想了解的更透徹,那就上網查查資料吧!在這里我就不再啰嗦虛函數的實現原理了。
這里也提供一個靜態多態的例子:
在上面例子的基礎之上添加模板函數:
template <class T> void DrawShape(T* t) { t->Draw(); }
修改main函數為如下:
void main() { CShape* shape = new CPoint(); //draw point shape->Draw(); DrawShape<CPoint>((CPoint*)shape); delete shape; shape = new CLine(); //draw Line shape->Draw(); DrawShape<CLine>((CLine*)shape); delete shape; return ; }
在程序編譯main函數的時候,編譯器就已經指定了DrawShape函數里面的Draw要調用那個實現了,這就是靜態多態,在編譯時就已經知道了要調用的函數。