今天上課的時候講到vtable,雖然早就知道有vtable這回事,今天趁著總結一下:
vtable的作用就是實現多型。表裡存放著父類以及包括本身類的虛函式的位址,表位於例項物件的首位址,即由乙個物件的位址就可以得到虛函式表。表以null結束。
cderived類不對繼承來的虛函式進行覆蓋。並且也定義自己的虛函式
則cderived d
虛函式表中 父類的虛函式位於子類虛函式之前,並且按宣告順序排列
如果cderived對父類的虛函式進行覆蓋,也定義自己的虛函式
則cderived d
父類中虛函式在虛函式表中的位置被子類重寫的函式覆蓋,沒有被覆蓋的函式沒有發生變化
這樣子就實現了多型
cderived d = new cderived;
cbase* cb = &d;
cb->f();
呼叫的是cderived的f()而不是cbase的,因為在虛函式表中,cbase的f()位置已經被cderived 的f()位址覆蓋
那麼這樣子只要是虛函式,則子類就可以訪問父類的成員了
**如下:
typedef void(*fun)(void);
cbase1* cb1 = new cderived;
int* piadres = (int*)*(int*)(cb1);
int ilength = 0;
fun* pf = null;
pf = (fun*)piadres ;
while (null != *pf)
成員函式訪問物件私有成員
在類的定義過程中,成員函式可以訪問傳遞過來的 同類物件 的所有成員 可以訪問私有成員 可以這樣理解 類是在編譯階段就存在的概念,物件是在執行階段才存在的。c 的私有判斷是在編譯時間決定的,因此c 的私有只能是基於類的,不是基於物件的。封裝是編譯期的概念,是針對型別而非物件的,在類的成員函式中可以訪問...
C 怎樣訪問私有成員函式
我知道的大概是三種方法 通過位址進行訪問 通過友元函式 通過友元類 第二種和第三種是比較常見的做法,第一種可能不太常見 這種方法能夠使用只要是因為類的儲存機制,類內只有成員變數和虛函式,所以可以利用位址來進行訪問。即通過a a int a 來實現 includeusing namespace std...
如何訪問私有成員變數和函式
一說到修改 delphi 原始碼或者訪問物件的私有成員函式,很多人馬上可以說出種種危害來否定我。這種做法我也提倡,但是有時候如果可以靈活運用,可以解決由於 delphi 因為封裝不正確而帶來的問題。我在這裡分享一些技巧 1.訪問私有成員變數 如果是 protected 的變數,可以用如下方法訪問 t...