C 虛函式指標虛函式表

2021-08-03 15:57:48 字數 2301 閱讀 4438

c++的多型可以分為靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,而通過虛函式可以實現動態多型。實現函式的動態聯編其本質核心則是虛表指標與虛函式表。

1. 虛函式與純虛函式區別

1)虛函式在子類裡面也可以不過載的;但純虛必須在子類去實現

2)帶純虛函式的類叫虛基類也叫抽象類,這種基類不能直接生成物件,只能被繼承,重寫虛函式後才能使用,執行時動態動態繫結!

2.子類繼承父類(子類和父類無同名虛函式的時候)

如果父類有實現名為虛函式fucna ,而子類沒有實現虛函式

funca

,那麼子類將繼承該虛函式,該虛函式將存在子類的虛函式表中。

3.子類繼承父類(子類覆蓋父類的同名虛函式時)

子類繼承父類,並且子類的虛函式覆蓋父類的同名虛函式的時候,子類的虛函式表將存放著子類的虛函式及沒有被覆蓋的同名虛函式。

4.為什麼建構函式不能是虛函式

虛函式對應乙個vtable,這大家都知道,可是這個

vtable

其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過

vtable

來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到

vtable

,所以建構函式不能是虛函式。

虛函式表和虛指標

虛函式表的位址vptr

虛指標函式在vtable裡面

從上圖可以看出,derived繼承base,子類derived實現的虛函式將覆蓋父類base的同名虛函式,如start,stop,另外子類derived將會繼承沒有實現的base虛函式,如stop2。

從圖中可以看出,虛函式表是實現多型的核心,即就算使用基類指標指向派生類物件,呼叫的虛函式跟通過虛函式表來查詢。

下面的**將顯示出虛函式的位址

常見虛函式面試題

45. 虛函式,虛函式表裡面記憶體如何分配?

編譯時若基類中有虛函式,編譯器為該的類建立乙個一維陣列的虛表,存放是每個虛函式的位址。基類和派生類都包含虛函式時,這兩個類都建立乙個虛表。建構函式中進行虛表的建立和虛表指標的初始化。在構造子類物件時,要先呼叫父類的建構函式,初始化父類物件的虛表指標,該虛表指標指向父類的虛表。執行子類的建構函式時,子類物件的虛表指標被初始化,指向自身的虛表。每乙個類都有虛表。虛表可以繼承,如果子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址,只不過這個位址指向的是基類的虛函式實現。派生類的虛表中虛函式位址的排列順序和基類的虛表中虛函式位址排列順序相同。當用乙個指標/引用呼叫乙個函式的時候,被呼叫的函式是取決於這個指標/引用的型別。即如果這個指標/引用是基類物件的指標/引用就呼叫基類的方法;如果指標/引用是派生類物件的指標/引用就呼叫派生類的方法,當然如果派生類中沒有此方法,就會向上到基類裡面去尋找相應的方法。這些呼叫在編譯階段就確定了。當涉及到多型性的時候,採用了虛函式和動態繫結,此時的呼叫就不會在編譯時候確定而是在執行時確定。不在單獨考慮指標/引用的型別而是看指標/引用的物件的型別來判斷函式的呼叫,根據物件中虛指標指向的虛表中的函式的位址來確定呼叫哪個函式。

46. 純虛函式如何定義?含有純虛函式的類稱為什麼?為什麼析構函式要定義成虛函式?

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。純虛函式是虛函式再加上= 0。virtual void fun ()=0。含有純虛函式的類稱為抽象類在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。同時含有純虛函式的類稱為抽象類,它不能生成物件。如果析構函式不是虛函式,那麼釋放記憶體時候,編譯器會使用靜態聯編,認為p就是乙個基類指標,呼叫基類析構函式,這樣子類物件的記憶體沒有釋放,造成記憶體洩漏。定義成虛函式以後,就會動態聯編,先呼叫子類析構函式,再基類。

47. c++ 中哪些不能是虛函式?

1)普通函式只能過載,不能被重寫,因此編譯器會在編譯時繫結函式。

2)建構函式是知道全部資訊才能建立物件,然而虛函式允許只知道部分資訊。

3)內聯函式在編譯時被展開,虛函式在執行時才能動態繫結函式。

4)友元函式 因為不可以被繼承。

5)靜態成員函式 只有乙個實體,不能被繼承。父類和子類共有。

虛函式表指標,虛函式表

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

C 虛函式指標虛函式表

c 的多型可以分為靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,而通過虛函式可以實現動態多型。實現函式的動態聯編其本質核心則是虛表指標與虛函式表。1.虛函式與純虛函式區別 1 虛函式在子類裡面也可以不過載的 但純虛必須在子類去實現 2 帶純虛函式的類叫虛基類也叫抽象類,這種基類不能...

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...