#include using namespace std;
class a
virtual void vhello()
上面**會輸出「hello」,然後就不會再有輸出。
1、為什麼p是空指標,還有輸出
在上面的程式中,p 明明是乙個空指標,為何通過它還能正確呼叫 a 的成員函式 hello 呢?p->hello()
實質上p應該是hello(p)
,在 hello 函式中,cout 語句沒有用到 this 指標,因此依然可以輸出結果。如果 hello 函式中有對成員變數的訪問,則程式就會出錯。
2、為什麼虛函式不輸出
虛函式在類中是通過虛函式表來存放的,虛函式表就是指標陣列,所以上面對虛函式的訪問等價於
*(p->vptr[1])(p);
由於p為null,所以無法找到虛函式指標,也就沒法呼叫虛函式了
例項化類的虛函式必須有定義,原因如下:有虛函式作為成員函式的類, 它的例項化-物件, 在執行過程分配到的記憶體不止是它的成員資料, 還有乙個指向該類虛函式表(vtable)的指標, 虛函式表中的每個資料項都是乙個虛函式的入口位址; 如果乙個物件的虛函式只有宣告而沒有實現, 就會出現這個虛函式表找不到本應作為其資料項之一的某函式的入口位址, 虛函式表在執行前不能裝載完成, 所以產生連線錯誤!
虛函式的用處
class a
a *b = new b隱式的派生類到基類的轉化,此時b只能訪問類a中的成員函式
輸出是
虛指標,虛函式,虛函式表,純虛函式
虛指標 虛繼承 在使用多重繼承時,如存在 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 時 存在以下記憶體儲存順序 虛指標 指向...
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
C 虛函式指標虛函式表
c 的多型可以分為靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,而通過虛函式可以實現動態多型。實現函式的動態聯編其本質核心則是虛表指標與虛函式表。1.虛函式與純虛函式區別 1 虛函式在子類裡面也可以不過載的 但純虛必須在子類去實現 2 帶純虛函式的類叫虛基類也叫抽象類,這種基類不能...