複習 C 之虛函式與多型

2021-09-12 22:55:26 字數 1106 閱讀 7358

c++中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術就是試圖使用不變的**來實現可變的演算法。比如:模板技術,rtti技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。

對c++了解的人都應該知道虛函式是通過一張虛函式表來實現的。在這個表中,主要是乙個類的虛函式位址表,虛函式表是在編譯時期就建立了,各個虛函式這時被組織成了乙個虛函式的入口位址的陣列,而物件的隱藏成員,虛函式表指標是在執行時期,也就是建構函式被呼叫時進行初始化的,這時實現多型的關鍵。

在c++的標準規格說明書中說道,編譯器必須要保證虛函式表的指標存在於物件例項中最前面的位置(這是為了保證正確取到虛函式的偏移量)。這意味著我們通過物件例項的位址得到這張虛函式表,然後就可以遍歷其中函式指標,並呼叫相應的函式。

多型是基於虛函式完成,虛函式基於重寫。

q:虛函式怎麼實現多型原理?

通過維護乙個虛函式列表v_table,虛函式列表的每個元素是乙個函式指標,指向乙個虛函式,或者子類重寫函式。需要vfptr記錄這個類所使用那個虛函式列表,之後 要用父類的指標呼叫虛函式,通過vfptr找到v_table列表中的函式呼叫。

v_table虛函式列表在編譯期建立,vfptr指向表的指標在建立物件的指標時存在,是父類中的第乙個資料成員,並且在建構函式裡的初始化指向自己類中。

虛函式實現多型的優點:復用,擴充套件。

虛函式實現多型的缺點:虛函式列表的空間,效率,安全性。

q:哪些函式需要使用虛函式,什麼時候實現多型?

如果父類的指標指向子類的物件,需要使用子類的東西都要是虛函式的。

q:什麼時候出現父類的指標指向子類的物件?

把不同的型別統一成同乙個種類。

關於安全性

通過父型別的指標訪問子類自己的虛函式,任何妄圖使用父類指標想呼叫子類中未覆蓋父類的成員函式的行為都會被編譯器視為非法。但在執行時可以通過指標的方式訪問虛函式列表來達到目的。

另外,如果父類的虛函式是private或是protected的,但這些非public的虛函式同樣會存在於虛函式列表中,所以我們同樣可以使用訪問虛函式列表的方式來訪問這些non-public的虛函式。

C 知識複習 多型 虛函式

兩個半月沒更部落格,人變得更菜了,開始挖個複習大坑。1.c 的三大特性 封裝 繼承 多型。2.多型 用一句話來概括,多型就是同一函式 方法 作用於不同的物件時,可以有不同的解釋,產生不同的執行結果。在面向程式設計中使用多型,能大大提高程式的可擴充性 include using namespace s...

C 繼承與多型之虛函式

一 定義 虛函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛函式的一般形式。虛函式是一種在基類定義為virtual的函式,並在乙個或多個派生類中再定義的函式。實現多型性。虛函式的特點是,只要定義乙個基類的指標,就可以指向派生類...

C 多型之虛函式

問題 用基型別的指標指向派生類物件時,通過這個指標來訪問該物件,這是會出現訪問到的只是從基類繼承來的同名成員。解決方法 在基類中將這個同名函式宣告為虛函式,這樣就可以通過基型別的指標,訪問不同派生類的物件產生不同的行為,從而實現執行過程的多型。語法 virtual 函式型別 函式名 形參表 注意 必...