c++中乙個類中無非有四種成員:靜態資料成員和非靜態資料成員,靜態函式和非靜態函式。
1.非靜態資料成員被放在每乙個物件體內作為物件專有的資料成員。
2.靜態資料成員被提取出來放在程式的靜態資料區內,為該類所有物件共享,因此只存在乙份。
3.靜態和非靜態成員函式最終都被提取出來放在程式的**段中並為該類所有物件共享,因此每乙個成員函式也只能存在乙份**實體。在c++中類的成員函式都是儲存在靜態儲存區中的,那靜態函式也是儲存在靜態儲存區中的,他們都是在類中儲存同乙個憊份。
因此,構成物件本身的只有資料,任何成員函式都不隸屬於任何乙個物件,非靜態成員函式與物件的關係就是繫結,繫結的中介就是this指標。成員函式為該類所有物件共享,不僅是處於簡化語言實現、節省儲存的目的,而且是為了使同類物件有一致的行為。同類物件的行為雖然一致,但是操作不同的資料成員。
#include"iostream.h"
class a
void print()
};void main()
4.單繼承的物件的記憶體布局
,第乙個為
虛
函式
表(vtable)
指標vptr,其後為成員且先基類後子類,虛函式表裡包含了所有的虛函式的位址,以null結束。虛函式如果子類有重寫,就由子類的重新的代替
《一》
上述類圖的解釋:b的v2覆蓋了a的v2,c的v1覆蓋了a的v1,c的v3覆蓋了b的v3.
注意:發生覆蓋的特徵有:
1) 不同的範圍(分別位於派生類與基類
);2)函式名字相同
;3)引數相同
;4) 基類函式必須有virtual關鍵字。
成員函式被過載的特徵
(1)相同的範圍(在同乙個類中
);(2)函式名字相同;
(3)引數不同;
(4)virtual關鍵字可有可無。
「隱藏
」是指派生類的函式遮蔽了與其同名的基類函式
,規則如下
(1)如果派生類的函式與基類的函式同名,但是引數不同
。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual 關鍵字
。此時,基類的函式被隱藏(注意別與覆蓋混淆)
C 物件的記憶體分布和虛函式表
c 中乙個類中無非有四種成員 靜態資料成員和非靜態資料成員,靜態函式和非靜態函式。1.非靜態資料成員被放在每乙個物件體內作為物件專有的資料成員。2.靜態資料成員 被提取出來放在程式的靜態資料區內,為該類所有物件共享 因此只存在乙份。3.靜態和非靜態成員函式 最終都被提取出來放在程式的 段中並為該類所...
C 物件的記憶體分布和虛函式表
c 物件的記憶體分布和虛函式表 c 中乙個類中無非有四種成員 靜態資料成員和非靜態資料成員,靜態函式和非靜態函式。1.非靜態資料成員被放在每乙個物件體內作為物件專有的資料成員。2.靜態資料成員被提取出來放在程式的靜態資料區內,為該類所有物件共享,因此只存在乙份。3.靜態和非靜態成員函式最終都被提取出...
C 物件記憶體分布(包括位元組對齊和虛函式表)
1 c 物件的記憶體分布和虛函式表 注意,物件中儲存的是虛函式表指標,而不是虛函式表,虛函式表在編譯階段就已經生成,同類的不同物件中的虛函式指標指向同乙個虛函式表,不同類物件的虛函式指標指向不同虛函式表。2 何時進行動態繫結 1 每個類物件在被構造時不用去關心是否有其他類從自己派生,也不需要關心自己...