關於動態繫結問題,我一直是看了懂,過一段時間又開始模糊了,今天決定把動態繫結問題的脈絡給理順,防止又忘記。
首先,動態繫結發生的條件,這是本文的核心問題,記住這個問題就可以萬變不離其宗了:在c++
基類,指標或引用,虛函式。記住這句話再分析幾個實際問題就會明白了。
其次是動態繫結的原因:靜態型別和動態型別不同。靜態型別是變數宣告時的型別,在這裡就是基類的型別,動態型別是變數記憶體中的物件型別。例如把基類指標變數賦值為派生類指標的值,就會發生靜態型別與動態型別不同的情況。
所以綜上可知,發生動態型別的必要條件是基類指標或引用(靜態型別),被賦值為派生類的指標或引用(動態型別),且呼叫了虛函式。
以下是在繼承體系中的常見問題(1)
c++11
新標準允許派生類顯示的註明那個函式改寫了基類的虛函式,具有做法是在該函式的形參列表之後增加
override
關鍵字。 (2
)關鍵字
virtual
只能出現在類的內部的宣告語句中兒不能出現在類外部函式定義中。 (3
)虛函式的解析過程發生在執行階段,普通成員函式發生在編譯過程。 (4
)基類中的靜態成員函式在整個繼承體系中也具有唯一性。 (5
)c++11
中提供了一種防止被繼承的方法,在類名後面加上關鍵字
final。
(6)表示式既不是引用也不是指標,則它的動態型別永遠和靜態型別一致。 (7
)不存在從基類向派生類的隱式轉換。 (8
)可以將基類的基類的指標和引用繫結到派生類物件上(基類部分)。
C 中的動態繫結
c 中基類和派生類遵循型別相容原則 即可用派生類的物件去初始化基類的物件,可用派生類的物件去初始化基類的引用可用派生類物件的位址去初始化基類物件指標。c 中動態繫結條件發生需要滿足2個條件 1 只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不能進行動態繫結 2 必須通過...
C 中的動態繫結
首先說明一下c 中的靜態繫結和動態繫結 靜態繫結 在編譯時刻,根據變數的靜態型別 變數宣告為基類還是派生類 來決定呼叫哪個函式,用基類宣告的,就呼叫基類的方法,用派生類宣告的就呼叫派生類的方法。動態繫結 在執行時刻,根據變數實際指向的物件型別 該變數指向基類還是派生類 來決定呼叫哪個函式。c 中對普...
C 中的動態繫結
c 中基類和派生類遵循型別相容原則 即可用派生類的物件去初始化基類的物件,可用派生類的物件去初始化基類的引用,可用派生類物件的位址去初始化基類物件指標。c 中動態繫結條件發生需要滿足2個條件 1 只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不能進行動態繫結 2 必須通...