因為虛函式的位址翻譯取決於物件的記憶體位址,而不取決於資料型別(編譯器對函式
呼叫的合法性檢查取決wnrnkti於資料型別)。原來,如果類中定義了虛函式,該類及其派生類
就要生成一張虛函式表,即vtable。而在類的物件位址空間中儲存乙個該虛函式表的入口,
佔4個位元組,這個入口位址是在構造物件是由編譯器寫入的。
有如下c++程式:
//#include
#includewww.cppcns.comeam>
using namespace std;
class cmem
public:
int m_first;
private:
unsigned char m_second;
public :
void fun1();
virtual int funover() };
class cmemsub : public cmem
public:
int m_three;
private:
int m_four;
public:
void fun3();
virtual int funover()
virtual int fun4()
};int main()
程式執行結果為:
這裡涉及到虛函式的工作機制,由於物件的記憶體空間中包含了虛函式表的入口,
編譯器能夠由這個入口找到適當的虛函式,這個函式的位址不再由資料型別決定了。
語句pmem = &b;使pmem指向物件b的記憶體空間,呼叫pmem->funover()時,
編譯器得到了物件b的vtable入口,並由這個入口找到了cmemsub::funover()虛函式位址。到此,虛函式的秘密終於大白於天下了。虛函式是c++語法的重點和難點。
C 記憶體分配機制
首先,來談談c 的5個儲存區 1.棧 是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。2.堆 由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動 3.自由儲存區 由malloc建立,由free釋放的動態記...
C C 中的記憶體分配機制
本文是總和了其它的幾篇帖子,主要是 一 字串 乙個字元乙個位元組,加上最後的乙個結束符 0 其中,strlen函式返回的字串長度不包括 0 sizeof操作符返回的位元組長度是包括 0 的。二 結構體的儲存 typedef struct sample sizeof sample 為1個位元組 typ...
C語言的記憶體的分配機制
指向字串常量的指標和字串陣列在使用時是有區別的。看下面兩個函式 執行通過,返回 hello world char ptrchar 執行錯誤,不能返回區域性變數 char arrchar 出現上面的原因在於指標pc指向的字串 hello world 存放在文字常量區,而陣列ac中存放的字串存放在棧區,...