天天看點

類中static函數能否virtual ?

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

解釋一:http://topic.csdn.net/t/20060603/08/4797568.html   (CSDN OOPhaisky)

首先,從“宏觀”上來說,static成員函數其實并不算“成員”,它相當于在類域中定義了一個全局函數(哈哈,好像有點兒自相沖突,但是相信大家能夠了解),是以static成員函數與對象是沒有“耦合”關系的(即,可以直接通過類調用static成員函數)。但是,virtual成員函數是絕對的“成員”,它與對象是100%的“耦合”(即,隻能通過對象來調用virtual成員函數才有意義)。 

其次,從“微觀”上來說,為什麼通路virtual成員函數一定要通過指針/引用/對象來進行呢(即,必須要有一個實際的對象存在)?因為要想正确定位到實際應該執行的函數,必須通過對象中的vptr(看清,是“對象中的vptr”,是以必須有對象)找到此class的virtual   table,然後利用virtual   table中某個索引處的函數指針來通路實際的成員函數。從此處可以看出,static成員函數的“不通過對象直接通過類名便可以調用”的特點不适用于virtual成員函數(virtual成員函數一定要通過指針/引用/對象來進行),是以函數不能同時為“virtual   static”。 

解釋二:http://topic.csdn.net/t/20060603/08/4797568.html  (CSDN liking100)

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

static   function都是靜态決議的(編譯的時候就綁定了), 

而virtual   function   缺是動态決議的(運作時候才綁定)! 

是以virtual   function   不能為static!

個人總結:

關于靜态函數能否為虛函數問題,主要涉及靜态函數和虛函數的編譯時機的不同。static函數屬于靜态聯編即在編譯時候就綁定成功;而virtual函數屬于動态聯編,通過相應對象中的虛函數表指針需找到相應的虛函數指針,完成動态綁定。關鍵之處在于static函數沒有this指針,屬于類而不屬于具體對象,是以static函數無法通過對象來調用,是以二者是不能同時成立的。