C 虛函式系列之一 統計class中虛函式的個數

2021-04-02 04:45:34 字數 2159 閱讀 4935

author

:jeff2005-12-2

關鍵字:

c++

虛函式棧

儲存環境:

window xp professional + sp2, vc6.0

無論在棧中還是在堆中申請記憶體空間,專案組都會要求用

memset()

將申請到的空間清

0。對於簡單資料型別陣列和結構簡單的

struct,class

,memset()

很好用。但是對於某些

struct

或者class

,memset()

之後程式會莫名其妙

down

掉,排起錯誤來很費力。最後發現用

memset()清0

的struct

或者class

,要麼裡面有虛函式,要麼包含的成員物件有虛函式;

memset()

將空間清

0,間接地將指向

virtual table

的指標清空。如果程式不

down

掉,那才奇怪呢!

下面看看

class

在棧中的儲存情況。

class

c001

;virtual

~c001

() ;

private

:virtual

void

display

(void

) public

:virtual

void

outp

(intn)

private

:int

pos;

charch;

};int

main

(void

)(**寫的不好看,將就)

編譯,debug

,看看變數在記憶體的儲存情況。

class

內部成員變數按定義的先後順序由低位址向高位址方向儲存(與棧的增長方向相反)。而函式內部變數儲存方向與

class

的相反,與棧的增長方向相同。

int*p = (int *)&c1;

printf

("*(p + 1) = %d/n"

, *(p+

1));

// value of pos

printf

("*(p + 2) = %d/n"

, (*(p+

2) &

0xff

));

// value of ch

printf

("*(p + 3) = 0x%08x/n"

, *(p+

3));

// value of d

在class

的第乙個變數的前面存放不是

cccccccc(debug版本)

,而是某個具體的值。這個值就是今後研究的重點,指向

virtual table

指標。class

在棧中的情況大致如下:

(我的機器上

virtual table

位於常量儲存區,有點怪怪的,不知道為什麼?)

virtual table

的第乙個元素是

c001::`scalar deleting destructor'(

不知道如何稱呼它)。在

c001::`scalar deleting destructor'

函式體內先呼叫

c001::~c001()

,再呼叫

operator delete

釋放申請的記憶體空間。

在virtual table

的最後是

00 00 00 00

,表示virtual table

的結束。有了這些,就可以計算

class

到底有多少個虛函式

(包括繼承來的)。

int*

p= (

int*)&c1;

int*q;

for(

inti= 0

; ;

i++) }對

class c001

來說,virtual function number

= 3。

c 基礎系列 虛函式 虛表

歡迎來到c 基礎系列的部落格 我們剛才例項化物件的時候,示例一直豬是這樣寫的 pig pig new pig 但因為其是繼承animal動物類的,所以說我們其實也可以這樣寫 animal pig new pig 這種寫法一般情況下沒有毛病,但是如果子類重寫了基類的方法時,就會出現問題 呼叫的還是基類...

C 系列之一 C 簡介

c 系列之一 c 簡介 c 是一種靜態型別的 編譯式的 支援過程化程式設計 物件導向程式設計和泛型程式設計的一種中級語言,任何合法的 c 程式都是合法的 c 程式。注意 使用靜態型別的程式語言是在編譯時執行型別檢查,而不是在執行時執行型別檢查。c 完全支援物件導向的程式設計,包括物件導向開發的四大特...

c 虛函式 一

虛函式是c 中用於實現多型 polymorphism 的機制。核心理念就是通過基類訪問派生類定義的函式。假設我們有下面的類層次 class a class b public a 那麼,在使用的時候,我們可以 a a new b a foo 在這裡,a雖然是指向a的指標,但是被呼叫的函式 foo 卻是...