天天看點

虛函數以及靜态綁定與動态綁定簡單總結

一個類添加了虛函數,對這個類有什麼影響?

一個類裡面定義了虛函數,那麼編譯階段,編譯器會給這個類類型産生一個唯一的虛函數表(vftable),虛函數表裡面儲存的内容主要是RTTI指針和虛函數的位址。當程式運作時,每張虛函數表都會加載到記憶體的.rodata區。

一個類裡定義了虛函數,那麼這個類定義的對象,其運作時,記憶體中開始的部分會多儲存一個vfptr虛函數指針,指向對應類型的虛函數表。一個類型定義的n個對象,vfptr指向的都是同一張虛函數表。

一個類中定義多個虛函數,不會影響對象記憶體的大小,隻會影響虛函數表的大小。

如果派生類的方法和基類繼承來的某個方法,傳回值、函數名、參數清單都相同,而且基類的方法是虛函數,那麼派生類中的這個方法自動處理成虛函數。

靜态綁定與動态綁定的差別?

靜态綁定是編譯時期的綁定,綁定的是普通函數的調用;動态綁定是運作時期的綁定,綁定的是對虛函數的調用

**重載:**一組函數要重載,必須處在同一作用域下,而且名字相同,參數清單不同。

**隐藏:**在繼承結構中,派生類的同名成員,把基類的同名成員給隐藏了。

**覆寫:**基類和派生類的方法,傳回值、函數名、參數清單都相同,而且基類的方法是虛函數,那麼派生類的方法就自動處理成虛函數,他們之間成為覆寫關系。

哪些函數不能處理成虛函數?

虛函數依賴:

1.虛函數能産生位址,儲存在vftable中。

2.對象必須存在(vfptr->vatable->虛函數位址)

派生類對象的構造過程:

1.先調用的是基類的構造函數

2.再調用派生類的構造函數

什麼時候 把基類的析構函數必須實作成虛函數?

基類的指針(引用)指向堆上new出來的派生類對象的時候

它在調用析構函數的時候,必須發生動态綁定,否則會導緻派生類的析構函數無法調用

是不是虛函數一定是動态綁定?

不是,在類的構造函數中,調用虛函數,是靜态綁定,不會發生動态綁定,用對象本身調用虛函數,也是靜态綁定。必須由指針或者引用調用虛函數,才會發生動态綁定。