類中static函式能否virtual

2021-06-10 06:22:24 字數 998 閱讀 4113

關於類中靜態函式能否為虛函式問題,有網友給出解釋很有道理,與大家共同分享一下:

解釋一:   (csdnoophaisky)

首先,從「巨集觀」上來說,static成員函式其實並不算「成員」,它相當於在類域中定義了乙個全域性函式(哈哈,好像有點兒自相矛盾,但是相信大家能夠理解),所以static成員函式與物件是沒有「耦合」關係的(即,可以直接通過類呼叫static成員函式)。但是,virtual成員函式是絕對的「成員」,它與物件是100%的「耦合」(即,只能通過物件來呼叫virtual成員函式才有意義)。 

其次,從「微觀」上來說,為什麼訪問virtual成員函式一定要通過指標/引用/物件來進行呢(即,必須要有乙個實際的物件存在)?因為要想正確定位到實際應該執行的函式,必須通過物件中的vptr(看清,是「物件中的vptr」,所以必須有物件)找到此class的virtual   table,然後利用virtual   table中某個索引處的函式指標來訪問實際的成員函式。從此處可以看出,static成員函式的「不通過物件直接通過類名便可以呼叫」的特點不適用於virtual成員函式(virtual成員函式一定要通過指標/引用/物件來進行),所以函式不能同時為「virtual   static」。 

解釋二:  (csdn liking100)

static成員沒有this指標是關鍵! 

static   function都是靜態決議的(編譯的時候就繫結了), 

而virtual   function   缺是動態決議的(執行時候才繫結)! 

所以virtual   function   不能為static!

個人總結:

關於靜態函式能否為虛函式問題,主要涉及靜態函式和虛函式的編譯時機的不同。static函式屬於靜態聯編即在編譯時候就繫結成功;而virtual函式屬於動態聯編,通過相應物件中的虛函式表指標需找到相應的虛函式指標,完成動態繫結。關鍵之處在於static函式沒有this指標,屬於類而不屬於具體物件,因此static函式無法通過物件來呼叫,因此二者是不能同時成立的。

c 中 static 變數和函式能否被子類繼承

1.父類的static變數和函式在派生類中依然可用,但是受訪問性控制 比如,父類的private域中的就不可訪問 而且對static變數來說,派生類和父類中的static變數是共用空間的,這點在利用static變數進行引用計數的時候要特別注意。2.static函式沒有 虛函式 一說。因為static...

static 函式 C 中的static

函式中的靜態變數 當變數宣告為static時,空間將在程式的生命週期內分配,其被存放在在全域性資料區。即使多次呼叫該函式,靜態變數的空間也只分配一次,前一次呼叫中的變數值通過下一次函式呼叫傳遞。這對於在c c 或需要儲存先前函式狀態的任何其他應用程式非常有用。ps 對於乙個完整的程式,在記憶體中的分...

C 類中的靜態成員函式 static

為了能方便訪問靜態資料成員,c 定義了一種特殊的成員函式來專門負責對靜態資料成員的訪問,這種函式叫做靜態成員函式。靜態成員函式的定義是在非靜態成員函式的定義前加上static關鍵字。它的訪問方式和靜態資料成員相似,也是通過作用域限定符來訪問,語法如下 類名 靜態成員函式名 引數 作為類的成員,靜態成...