虛函式和虛函式表

2021-10-07 11:06:10 字數 1241 閱讀 4645

虛函式和虛函式表

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

關於多型,簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。

如果呼叫非虛函式,則無論實際物件是什麼型別,都執行基類型別所定義的函式。非虛函式總是在編譯時根據呼叫該函式的物件,引用或指標的型別而確定。如果呼叫的是虛函式,則直到執行時才能確定呼叫哪個函式,執行的虛函式是引用所繫結或指標所指向的物件所屬型別定義的版本。

虛函式必須是基類的非靜態成員函式。虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。

虛函式帶來的好處就是: 可以定義乙個基類的指標, 其指向乙個繼承類, 當通過基類的指標去呼叫函式時, 可以在執行時決定該呼叫基類的函式還是繼承類的函式. 虛函式是實現多型(動態繫結)/介面函式的基礎. 可以說: 沒有虛函式, c++將變得一無是處!

(2)純虛函式: 純虛函式只有函式的名字而不具備函式的功能,不能被呼叫。它只是通知編譯系統:「在這裡宣告乙個虛函式,留待派生類中定義」。在派生類中對此函式提供定義後,它才能具備函式的功能,可被呼叫。宣告純虛函式的一般形式是

virtual 函式型別 函式名 (參數列列)=0;

純虛類也稱抽象類,凡是包含純虛函式的類都是抽象類。因為純虛函式是不能被呼叫的,包含純虛函式的類是無法建立物件的。

抽象類的作用是作為乙個類族的共同基類,或者說,為乙個類族提供乙個公共介面。

虛函式表:為了實現c++的多型,c++使用了一種動態繫結的技術。這個技術的核心是虛函式表。每個包含了虛函式的類都包含乙個虛表。

為實現動態聯編,編譯器為每個包含虛函式的類建立乙個表,稱為vtable,在vtable中,編譯器放置了特定類的虛函式位址,在每個帶有虛函式的類中編譯器會秘密地設定乙個虛函式表指標,稱為vptr,指向物件的vtable,通過基類指標做虛函式呼叫時,也就是多型 呼叫時,編譯器靜態地插入取得這個vptr,並在vtable表種查詢函式位址的**,這樣就能呼叫正確的函式。

動態聯編是指在程式執行的時候才將函式實現和函式呼叫關聯,因此也叫執行時繫結或者晚繫結,動態聯編對函式的選擇不是基於指標或者引用,而是基於物件型別,不同的物件型別將做出不同的編譯結果。c++中一般情況下聯編也是靜態聯編,但是一旦涉及到多型和虛函式就必須要使用動態聯編了。

虛函式和虛函式表

多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。這個類的每乙個物件都會包含乙個虛指標 虛指標存在於物件例項位址的最前面,保證虛函式表有最高的效能 這個虛指標指向虛函式表。注 物件不包含虛函式表,只有虛指標,類才包含虛函式表,派生類會生成乙個相容基類的虛函式表。下圖是原始基...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛函式指標和虛函式表

虛函式指標和虛函式表 虛函式表的定義 多型是由虛函式實現的,而虛函式主要是通過虛函式表 v table 來實現的。如果乙個類中包含虛函式 virtual修飾的函式 那麼這個類就會包含一張虛函式表 vftbl 虛函式表儲存的每一項是乙個虛函式的位址。在乙個物件的記憶體布局中,指向這張虛函式表的指標 v...