靜態函式能否為virtual或者const函式

2021-08-17 04:42:38 字數 1247 閱讀 5919

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 堆 動態儲存...