C 物件模型

2021-08-19 19:32:08 字數 3475 閱讀 6008

c++中虛函式的主要作用就是實現多型

虛函式表是通過一塊連續記憶體來儲存虛函式的位址

在有虛函式的物件例項中都存在一張虛函式表,指明了實際呼叫的虛函式

例項化出的物件的頭上四個位元組存放虛表指標

若派生類b繼承基類a,則b先開一塊空間,將a的虛表拷貝下來,用b的虛表覆蓋

虛表存在於常量區,不可能在棧上.若區域性變數,棧會隨著函式的釋放而銷毀,出現野指標

虛表中存放虛函式指標陣列,以0結尾

單繼承物件模型

//此**用於32位平台

class base

virtual void func2()

private:

int _b;

};class derive :public base

virtual void func3()

void func4()

private:

int _d;

};typedef void (*func)();

void printvtable(int* table)

cout << endl;

}void test()

int main()

若要在32位和64位平台下均可執行,則將int*轉換成int**

解引用取int*個位元組,int*為指標,即為4個位元組,也可以轉換為char**...

多繼承物件模型

derive重寫每個父類的func1()

自己獨有的虛函式存放於先繼承的父類的虛表中

*呼叫所有的虛函式都要到虛表中查詢嗎?

不是,構成多型的虛函式才要到虛表中查詢(指標或引用)

菱形繼承物件模型

菱形虛繼承物件模型

class a

int _a;

};class b :virtual public a

int _b;

};class c :virtual public a

int _c;

};class d :public b, public c

virtual void func2()

int _d;

};int main()

若不在d中重寫func1(),則**無法編譯通過.因為編譯器不清楚a中的虛表是b的重寫還是c的重寫

若在d中增加自己的虛函式func2(),則虛函式寫入先繼承的父類b中,b中虛基表指標前面新增乙個虛表指標,虛基表的第一行填入

虛基表到虛表的距離,即-4

若在b,c中增加虛函式func3(),則sizeof(d)=36

多型

靜態多型: 過載,在編譯期決議確定

靜態聯編對函式的選擇是基於指向物件的指標或者引用的型別,通過物件指標進行的普通成員函式的呼叫,僅僅與指標的型別有

關,而與此刻指標正指向什麼物件無關

動態多型: 通過繼承重寫基類的虛函式實現的多型,,在執行時決議確定

動態聯編只能通過指向基類的指標或基類物件的引用來呼叫虛函式

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...