C 關於虛類,虛函式以及友元的知識

2021-08-20 11:35:08 字數 1082 閱讀 9189

關於虛類與虛繼承

虛繼承主要用於解決菱形繼承問題,解決乙個孫子類繼承爺爺類兩次的問題。防止出現二義性。虛繼承底層實現原理與編譯器相關,一般通過虛基類指標和虛基類表實現,每個虛繼承的子類都有乙個虛基類指標(占用乙個指標的儲存空間,4位元組)和虛基類表(不占用類物件的儲存空間)(需要強調的是,虛基類依舊會在子類裡面存在拷貝,只是僅僅最多存在乙份而已,並不是不在子類裡面了);當虛繼承的子類被當做父類繼承時,虛基類指標也會被繼承。實際上,vbptr指的是虛基類表指標(virtual base table pointer),該指標指向了乙個虛基類表(virtual table),虛表中記錄了虛基類與本類的偏移位址;通過偏移位址,這樣就找到了虛基類成員,而虛繼承也不用像普通多繼承那樣維持著公共基類(虛基類)的兩份同樣的拷貝,節省了儲存空間。

虛函式與虛指標

虛函式是c++表現多型性的乙個重要呈現,關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的**來實現可變的演算法。而虛函式就是通過動態繫結實現多型。

虛函式可以是內聯函式,內聯是可以修飾虛函式的,但是當虛函式表現多型性的時候不能內聯。

內聯是在編譯器建議編譯器內聯,而虛函式的多型性在執行期,編譯器無法知道執行期呼叫哪個**,因此虛函式表現為多型性時(執行期)不可以內聯。

inline virtual 唯一可以內聯的時候是:編譯器知道所呼叫的物件是哪個類,這只有在編譯器具有實際物件而不是物件的指標或引用時才會發生。

與虛函式相關的是虛函式指標與虛函式表。

虛函式指標是指向虛函式表的,而虛函式表是存放虛函式位址的乙個表,程式執行時會從該表中找到虛函式指標指向的函式進行呼叫,如果派生類實現了基類的某個虛函式,則在虛表中覆蓋原本基類的那個虛函式指標,在編譯時根據類的宣告建立。而虛函式指標是存放在類的例項中的。虛函式表存放在類的例項的記憶體中。

友元友元可以分為友元類和友元函式,友元的關係是單向的且不可繼承。友元在一定程度上破壞了類的封裝性,因為一旦乙個類或者函式定義為某個類的友元,則可以訪問該類的私有成員。友元只能在類中宣告,但可以在任何地方定義,友元關鍵字只需要在宣告的時候加入即可,這一點和內聯函式恰好相反。

虛函式 虛基類 純虛函式 友元

虛基類 當在多條繼承路徑上有乙個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項 或多個副本 若只想儲存這個基類的乙個例項,可以將這個公共基類說明為虛基類.classx1 virtual public x classx2 virtual public x 虛函式實際上,優秀的程...

C 中虛函式,純虛函式以及多型

關於建構函式和析構函式 在整理排序演算法的時候想到可以藉此熟悉一下類的構造以及繼承等知識點,就寫了乙個排序基類宣告乙個排序函式,然後寫多個排序演算法的子類重寫這個排序函式,過程中順便研究了一下virtual和多型的概念。首先回顧一下虛函式和純虛函式的八股文,虛函式是多型的實現機制,宣告乙個虛函式就是...

C 多型 虛函式 虛析構函式以及虛函式表

什麼是多型 指不同物件收到相同訊息時或相同物件收到不同訊息時產生不同的動作。這裡先說下為什麼會用到虛函式 以下面的程式為例 這個程式中,carp是fish的繼承類,而carp中覆蓋了swim這個方法,在makefishswim這個函式中,要使用fish類的形參,而你將yourfish這個carp類的...