關於類中靜態函式能否為虛函式問題,有網友給出解釋很有道理,與大家共同分享一下:
解釋一: (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關鍵字。它的訪問方式和靜態資料成員相似,也是通過作用域限定符來訪問,語法如下 類名 靜態成員函式名 引數 作為類的成員,靜態成...