多型的物件模型

2021-08-05 19:16:28 字數 1828 閱讀 8353

多型的物件模型,有單繼承與多繼承,複雜點的有菱形繼承和菱形虛擬繼承。而需要理解多型這個概念,就得先知道虛函式,而虛函式裡有叫虛函式表的東西,而c++中的虛函式的主要作用,就是來實現其多型的,簡單點來說就是父類的指標或引用呼叫重寫的虛函式,當父類指標/引用指向父類物件時呼叫父類的虛函式,當指向子類物件時則呼叫子類虛函式,乙個指標,根據傳參型別進而改變呼叫的虛函式,這便是多型。

先說下虛函式表,顧名思義跟虛函式有關,這張表的內容存的就是呼叫時所需的虛函式的位址,這張虛函式表解決了虛函式的重寫的問題。

下面先從簡單虛函式談起吧,後面都用畫板截圖方式進行闡述,可能有點亂,見諒。

這裡先建立乙個base型別的 b1例項化變數,而base中存在virtual虛函式,則需要在例項化b1時先將虛函式表放入其中,如vs2008監視視窗裡所示,虛函式表位於b1中的最上面的位置。

通過上面的圖板解釋,你已經有所了解虛函式和虛函式表了吧,下面在深入一點,講講單繼承,話不多說,上圖~~~~

下面圖中的一串字不一定正確,請持懷疑的態度:

在我寫完下面的多繼承時,便推翻了我在畫單繼承時的結論,下面請觀賞下部:

看到這個圖是不是忽然有點頭暈了呢。。。唉,我的頭怎麼也有點暈乎乎的呢,沒事,我帶領大家來解讀這張"應該""貌似"是我畫的圖,首先,有三個類,兩個基類,乙個子類,base1是基類1,裡面有虛函式virtual fun1()和virtual fun2(),還有b1,基類2是base2,裡面有虛函式virtual fun3(),virtual fun4(),子類derive繼承他們兩個,首先可以看到d1,它重寫,還繼承了base1,base2,如我所想,在監視器中就是如此,兩個虛表位址,指向兩個虛表,分別是base1和base2,而子類中獨有的fun5()在最前面的虛表中存放,不會另開乙個虛表進行存放子類的虛函式,這裡可以明白,回到單繼承那張圖的話中,於是我就想驗證一下是不是存放的是「同乙個」函式呢,於是我有建立了乙個base1類的b1,通過觀察b1中虛表中存放虛函式的位址來驗證我的單繼承結論是否正確,正好如我所想,是錯誤的。它們位址不同,所以我知道了我自己的結論是錯的,但我有建立了乙個base1類的b3,我還是不死心,於是檢視了監視器,他的虛函式位址和b1相同,所以我又得出了乙個結論(雖然不知道會不會又被推翻):當兩個型別相同時,他們共用乙個虛函式表,但是如果重寫/覆蓋時,則將另分配乙個虛函式表進行存放(不是「同乙個」虛函式)。在最後,通過兩個框,可以知道了解d1和b1的儲存結構。

講到這裡,我似乎感覺我的頭更暈了,c++就是這樣,如果你感覺你頭暈,那麼說明你在進步,如果你不頭暈,兩個結果,一是你可能還沒入門,二是你已經精通c++,為了明天的不頭暈,今天我們頭更暈一點吧!!!

多型 多型的物件模型

什麼是多型?多型性可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。多型 polymorphism 字面意思多種形態。c 多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法稱為覆蓋 override 或者稱為重寫...

多型 多型物件模型

1 什麼多型?當使用基類的指標或引用呼叫重寫的虛函式時,指向父類調的就是父類的虛函式,指向子類調的就是子類的虛函式。下面我們來看一段 sizeof aa 的結果為什麼會是8呢?這是因為函式fun1是乙個虛函式,函式內部存在乙個虛表指標。單繼承物件模型 由於編譯器做了一定的優化,子類中自己定義的函式在...

多型 多型物件模型

一 什麼是多型。物件導向語言有三大特點,封裝 繼承 多型。今天就討論一下多型,多型是 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類就是呼叫子類的虛函式。多型 多種形態。多型分為靜態多型和動態多型。實現多型的其中乙個條件必須是要把子類給給父類,要構成is a的...