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