通過虛函式表 私有成員是可以訪問的

2021-07-13 05:56:16 字數 1196 閱讀 7678

今天上課的時候講到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...