1. virtual與靜態函式
c++中,靜態成員函式不能被宣告為virtual函式。
例如,下面的程式會編譯失敗。
#includeclass test
};
同樣地,靜態成員函式也不能被宣告為const和.
下面的程式也會編譯失敗。
#includeclass test
// 如果宣告為下面這樣,是可以的。
const static void fun() {}
// 或類似於
const static int fun()
};
2.為何static成員函式不能為virtual
(1). static成員不屬於任何類物件或類例項,所以即使給此函式加上virutal也是沒有任何意義的。
(2). 靜態與非靜態成員函式之間有乙個主要的區別。那就是靜態成員函式沒有this指標。
虛函式依靠vptr和vtable來處理。vptr是乙個指標,在類的建構函式中建立生成,並且只能用this指標來訪問它,因為它是類的乙個成員,並且vptr指向儲存虛函式位址的vtable.
對於靜態成員函式,它沒有this指標,所以無法訪問vptr. 這就是為何static函式不能為virtual.
虛函式的呼叫關係:this -> vptr -> vtable ->virtual function
通過下面例子可以確定,當類增加了乙個虛函式後,類的大小會增大4位元組(指標的大小).
class test
;sizeof(test) = 4;
加入虛函式後,
class test
;sizeof(test) = 8
3. 為何static成員函式不能為const函式
當宣告乙個非靜態成員函式為const時,對this指標會有影響。對於乙個test類中的const修飾的成員函式,this指標相當於test const *, 而對於非const成員函式,this指標相當於test *.
而static成員函式沒有this指標,所以使用const來修飾static成員函式沒有任何意義。
volatile的道理也是如此。
public:
int _m;
virtual void fun();
};sizeof(test) = 8
靜態函式與非靜態函式的區別
靜態成員函式和非靜態成員函式的根本區別在於有無this指標。非靜態函式由物件名或者物件指標 呼叫,呼叫時編譯器會向函式傳遞this指標 靜態成員函式則由類名 或者物件名呼叫 非靜態函式中有this指標,靜態函式中沒有this指標,不能訪問物件的成員函式,成員函式有this指標,const修飾this...
類中static函式能否virtual
關於類中靜態函式能否為虛函式問題,有給出解釋很有道理,與大家共同分享一下 解釋一 oophaisky 首先,從 巨集觀 上來說,static成員函式其實並不算 成員 它相當於在類域中定義了乙個全域性函式 哈哈,好像有點兒自相矛盾,但是相信大家能夠理解 所以static成員函式與物件是沒有 耦合 關係...
c靜態函式
c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。5 堆 動態儲存...