多型,覆蓋,過載,靜態聯編,動態聯編。

2021-06-22 16:15:32 字數 1663 閱讀 1578

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 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...

靜態聯編和動態聯編

聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...

靜態聯編和動態聯編

聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...