c++多型有兩種形式,動態多型和靜態多型。
動態多型是指一般的多型,是通過類繼承和虛函式機制實現的多型;
靜態多型是通過模板方法來實現,因為這種多型是在編譯時而非執行時,所以稱為靜態多型。
動態多型例子:
class cshape
virtual ~cshape(){}
virtual void draw() = 0;
};class cpoint : public cshape
~cpoint(){}
void draw() };
class cline : public cshape
~cline(){}
void draw()//覆蓋 };
void main()
由上面的例子,大家應該能理解什麼是多型了:也就是乙個draw() 可以有兩種實現,並且是在執行時決定的,在編譯階段不知道,也不可能知道!只有在執行的時候才能知道我們生成的shape是那種圖形,當然要實現這種效果就需要動態聯編了,在基類我們會把想要多型的函式宣告為虛函式,而虛函式的實現原理就使用了動態聯編。
乙個靜態多型的例子:
在上面例子的基礎之上新增模板函式:
template void drawshape(t* t)
修改main函式為如下:
void main()
在程式編譯main函式的時候,編譯器就已經指定了drawshape函式裡面的draw要呼叫那個實現了,這就是靜態多型,在編譯時就已經知道了要呼叫的函式。
靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯編也叫早繫結,在編譯階段就必須了解所有的函式或模組執行所需要檢測的資訊,它對函式的選擇是基於指向物件的指標(或者引用)的型別,c語言中,所有的聯編都是靜態聯編,據我所知道的,任何一種編譯器都支援靜態聯編(廢話)。
動態聯編是指在程式執行的時候才將函式實現和函式呼叫關聯,因此也叫執行時繫結或者晚繫結,動態聯編對函式的選擇不是基於指標或者引用,而是基於物件型別,不同的物件型別將做出不同的編譯結果。c++中一般情況下聯編也是靜態聯編,但是一旦涉及到多型和虛函式就必須要使用動態聯編了
乙個靜態聯編的例子:
class shape
};class circle:public shape
class circle:public shape
覆蓋:在基類中定義了乙個非虛函式,然後在派生類中又定義了乙個同名同引數同返回型別的函式,這就是覆蓋了。在派生類物件上直接呼叫這個函式名,只會呼叫派生類中的那個。
過載:在基類中定義了乙個非虛函式,然後在派生類中定義乙個同名,但是具有不同的參數列的函式,這就是過載。在派生類物件上呼叫這幾個函式時,用不同的引數會呼叫到不同的函式,有可能會直接呼叫到基類中的那個。
多型:在基類中定義了乙個虛函式,然後在派生類中又定義乙個同名,同參數列的函式,這就是多型。多型是這3種情況中唯一採用動態繫結技術的一種情況。也就是說,通過乙個基類指標來操作物件,如果物件是基類物件,就會呼叫基類中的那個函式,如果物件實際是派生類物件,就會呼叫派聲類中的那個函式,呼叫哪個函式並不由函式的參數列決定,而是由函式的實際型別決定。
靜態聯編與動態聯編
在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...
靜態聯編和動態聯編
聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...
靜態聯編和動態聯編
聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...