早繫結的問題與動態繫結

2021-07-31 11:44:00 字數 859 閱讀 5043

物件可以作為自己的類或者作為它的基類(父類)的物件來使用。還能通過基類的位址來操作它。取乙個物件的位址(指標或引用),並將其作為基類的位址來處理,稱為向上型別轉換。也就是說,父類引用或指標可以指向子類物件,通過父類指標或引用操作子類物件。

class human

};class dog:public human

};void fun(human& h)

void test()

程式的輸出結果是human eat bread。給fun()傳入的物件是dog類,而不是human類,但輸出的結果卻不是dog eat meat。這是由於早繫結引起的。

編譯器在只有human位址時並不知道要呼叫正確的函式。編譯時根據指向物件的指標或引用的型別來選擇函式呼叫。由於fun()的引數型別是human&,編譯器確定要呼叫的是human::eat(),而不是真正傳入的物件dog::eat()。解決這個問題的方法就是遲繫結,意味著繫結要根據物件的實際型別,發生在程式正在執行的時候。

c++動態多型性用虛函式來實現。虛函式允許子類(派生類)重新定義父類(基類)成員函式。而子類(派生類)重新定義父類(基類)虛函式的做法稱為覆蓋或者重寫。

實現動態繫結的方法與規則:

1.建立乙個需要動態繫結的函式,在函式宣告前加上virtual關鍵字,如果乙個函式在基類中被宣告為virtual,那麼在所有派生類中它都是virtual的。

2.在派生類中對virtual函式充定義(重寫)。

3.virtual關鍵字只能修飾成員函式。

4.建構函式不能宣告為虛函式。

class human

};class dog:public human

};void fun(human& h)

void test()

早繫結和晚繫結

虛函式和一般函式 早繫結與晚繫結 說早繫結和晚繫結的時候,先來看看繫結的意思吧。繫結的英文名為binding 把函式體和函式呼叫相聯絡稱為繫結。類中的一般的函式都是早繫結,也就是說 在呼叫的地方,就已經把要呼叫的函式確定好了,呼叫的類就是定義它的類。現在的 向上對映 就會導致早繫結的問題 inclu...

動態繫結與靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更...

動態繫結與靜態繫結

對指標來說 動態型別與靜態型別 動態型別是所指向的物件型別,這發生在程式執行期,靜態型別是宣告時指標時候,指標本身的型別,這發生在編譯期 所以說靜態型別宣告好後就不發生改變了,動態型別,可以執行改變,也就是允許指向不同的物件型別 如 基類classa 子類 class b publica pa靜態型...