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 卻是...