筆記1 C 虛函式 多型

2021-10-03 21:10:45 字數 1520 閱讀 8365

1、c++虛函式原理:

虛函式:指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。

c++中虛函式表的作用主要是實現了多型的機制。

多型:就是用父類的指標指向其子類的例項,然後通過父類的指標根據不同的子類物件呼叫實際子類的成員函式,這種方法既不需要改動**就可以讓父類指標執行很多子類的操作,這就是虛函式的實現機制。

class base

virtual void func2()

//...

virtual void funcn() };

class derived : public base

virtual void funcn()

};

由於這兩個類中有虛函式存在,編譯器將為實現了虛函式的基類和覆蓋了虛函式的派生類分別建立乙個虛函式表(virtual function table,vft)。也就是說base和derived類都有自己的虛函式表。

虛函式表的作用就是儲存自己類中虛函式的位址,我們可以把vft形象地看成乙個陣列,這個陣列的每個元素存放的就是虛函式的位址

例項化這些類的物件時,將建立乙個隱藏的指標vp*,它指向相應的vft。可將vft視為乙個包含函式指標的靜態陣列,其中每個指標都指向相應的虛函式。base類和derived類的虛函式表如下圖所示:

驗證虛函式表的存在可以通過比較同乙個類,乙個包含虛函式,乙個不包含,對比其大小。

虛函式表:

類的虛函式表是一塊連續的記憶體,每個記憶體單元中記錄乙個jmp指令的位址

注意的是,編譯器會為每個有虛函式的類建立乙個虛函式表,該虛函式表將被該類的所有物件共享。類的每個虛成員佔據虛函式表中的一行。如果類中有n個虛函式,那麼其虛函式表將有n*4位元組的大小。

虛函式(virtual function)是通過一張虛函式表(virtual table)來實現的。簡稱為v-table。在這個表中,主要是乙個類的虛函式的位址表,這張表解決了繼承、覆蓋的問題,保證其真實反應實際的函式。這 樣,在有虛函式的類的例項中這個表被分配在了這個例項的記憶體中,所以,當用父類的指標來操作乙個子類的時候,這張虛函式表就顯得由為重要了,它就像乙個地 圖一樣,指明了實際所應該呼叫的函式。

編譯器應該是保證虛函式表的指標存在於物件例項中最前面的位置(這是為了保證取到虛函式表的有最高的效能——如果有多層繼承或是多重繼承的情況下)。 這意味著可以通過物件例項的位址得到這張虛函式表,然後就可以遍歷其中函式指標,並呼叫相應的函式。

通過虛函式表指標vptr呼叫重寫函式是在程式執行時進行的,因此需要通過定址操作才能確定真正應該呼叫的函式。而普通成員函式是在編譯時就確定了呼叫的函式。在效率上,虛函式的效率要低很多。

多型與虛函式 程式設計題 1 C 程式設計第6周

注意 總時間限制 1000ms 記憶體限制 65536kb 下面程式的輸出結果是 a fun c do 請填空 123 4567 89 1011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 32 include using namespace ...

C 多型,虛函式

在c 中可以用基類指標指向其派生類,如果乙個派生類繼承多個父類,那麼如何通過基類指標訪問同名的成員呢?如果基類a,基類b中都有函式fun 派生類在同時繼承a b後在記憶體中根據繼承的順序分配記憶體,例如在繼承列表中出現的是b,a,那麼b中的成員在a的之前,當我們用b的指標去訪問時候,編譯器便將指標指...

C 虛函式多型

由虛函式實現的動態多型性就是 同一類族中不同類的物件,對同一函式呼叫作出不同的響應。虛函式的使用方法是 1 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。2 在派生類中重新定義此函式,要...